본문 바로가기

에러

[Node.js ERR_HTTP_HEADERS_SENT 에러] 헤더를 세팅하지 말라고?

에러 배경

node.js를 사용해 서버의 기본 틀을 만들어 가는 과정에서 에러가 발생했다. 현재 코드에서 에러를 처리하는 코드는 따로 없기 때문에 서버가 멈추는 건 아니지만 에러가 터미널에 출력된다.

에러 그 잡채

에러 메시지를 읽어보면 클라이언트에게 보내고 난 후에 headers를 set 할 수 없다.

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (node:_http_outgoing:659:11)
    at ServerResponse.header (C:\Users\User\Desktop\TY\다른 컴퓨터\ProgrammersSchool\PROJECT-BOOKSHOP\node_modules\express\lib\response.js:795:10)
    at ServerResponse.send (C:\Users\User\Desktop\TY\다른 컴퓨터\ProgrammersSchool\PROJECT-BOOKSHOP\node_modules\express\lib\response.js:175:12)
    at ServerResponse.json (C:\Users\User\Desktop\TY\다른 컴퓨터\ProgrammersSchool\PROJECT-BOOKSHOP\node_modules\express\lib\response.js:279:15)
    at C:\Users\User\Desktop\TY\다른 컴퓨터\ProgrammersSchool\PROJECT-BOOKSHOP\routes\books.js:15:19
    at Layer.handle [as handle_request] (C:\Users\User\Desktop\TY\다른 컴퓨터\ProgrammersSchool\PROJECT-BOOKSHOP\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\User\Desktop\TY\다른 컴퓨터\ProgrammersSchool\PROJECT-BOOKSHOP\node_modules\express\lib\router\route.js:149:13)
    at Route.dispatch (C:\Users\User\Desktop\TY\다른 컴퓨터\ProgrammersSchool\PROJECT-BOOKSHOP\node_modules\express\lib\router\route.js:119:3)
    at Layer.handle [as handle_request] (C:\Users\User\Desktop\TY\다른 컴퓨터\ProgrammersSchool\PROJECT-BOOKSHOP\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\User\Desktop\TY\다른 컴퓨터\ProgrammersSchool\PROJECT-BOOKSHOP\node_modules\express\lib\router\index.js:284:15

해결 과정

해결. res를 두 번 보냈는지 확인

하나의 요청에 조건문을 통해 여러 응답을 보내고 있는 상황에서 else로 조건을 나눠주지 않거나 return을 해주지 않아서 하나의 요청에 res가 두 번 날아가서 발생한 에러였다.

router.route("/").get((req, res) => {
  // 카테고리별 책 목록 조회
  const { categoryId, isNew } = req.query;
  if (categoryId && isNew) {
    return res.status(200).json({
      message: "카테고리별 책 목록 조회 success",
    });
  }
  // 전체 책 목록 조회
  res.status(200).json({
    message: "전체 책 목록 조회 success",
  });
});

정리

이번 에러는 단순한 에러였기 때문에 금방 찾아낼 수 있었다.