캐럿마켓 클론 코딩 중 , 이메일로 전송된 회원 인증 토큰을 입력하였을때, 500에러 발생.
로컬 서버에서의 오류 구문 확인 :
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at new NodeError (node:internal/errors:387:5)
오류 구문의 내용 :
- 해당 코드가 동일한 요청에 대해 둘 이상의 응답을 보내려고 할 때마다 발생함.
이 문제에서 고려해 볼 것
- CORS: 해당 오류를 일으키는 원인에 대해 찾아보았으나, 참조하는 외부 사이트가 지금의 경우에는 없고, prisma 와 planetscale의 연결상 오류를 찾을 수 없었음.
- content-type: 코드 상에는 ‘application/json’ 으로 작성되었으나 vercel을 통한 배포판에서는 ‘text/html’ 로 나옴. fetch 구문에 작성된 해당 코드를 text/html 로 변경하였을시 로직 구현이 안됨.
- content-length : 해당 값이 0으로 나오는 경우 , POST 전송이 안되었다고 추측할 수 있다.
해결 방법 :
해당 로직 (입력받은 토큰을 DB에 저장)은 비동기로 구현되기 때문에, 요청을 보낸후 요청 처리기의 추가 코드 실행을 중지해야함.
- 오류 코드위 코드에 return; 을 추가하여 해당 요청을 종료 시켜야한다.
if (req.method === "POST") { const foundToken = await client.token.findUnique({ where: { payload: token, }, // include: { user: true }, }); if (!foundToken) return res.status(404).end(); console.log("foundToken!!", foundToken); req.session.user = { id: foundToken.userId, }; await req.session.save(); await client.token.deleteMany({ where: { userId: foundToken.userId, }, }); // res.status(200).end(); res.json({ ok: true }); }- 수정 코드
if (req.method === "POST") { const foundToken = await client.token.findUnique({ where: { payload: token, }, // include: { user: true }, }); if (!foundToken) return res.status(404).end(); console.log("foundToken!!", foundToken); req.session.user = { id: foundToken.userId, }; await req.session.save(); await client.token.deleteMany({ where: { userId: foundToken.userId, }, }); // res.status(200).end(); res.json({ ok: true }); return; // 리턴 추가. }
'에러 해결' 카테고리의 다른 글
| 자바 에러 - com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "필드명" (0) | 2023.05.30 |
|---|