min8282

Cannot set headers after they are sent to the client 오류 본문

Dev/Node.js

Cannot set headers after they are sent to the client 오류

min8282 2024. 4. 30. 18:47

node.js로 express를 사용하는 중 아래와 같이 오류가 발생했다.

 

[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client.

 

[ERR_HTTP_HEADERS_SENT]는 서버가 클라이언트에 2개 이상의 응답을 보내려고 할 때 발생하는 오류라고 한다.

 

즉. 하나의 응답을 보낸 후 또 다른 응답을 동시에 보내려고 할 때 발생하는 오류다.

결론 먼저 말하자면 위 코드는 /login 시 GET으로 실행되는 작업이 2개여서 위와 같은 에러가 났다. => 내 잘못

 

이 경우는 루트 페이지 /로 이동하면 로그인 페이지로 이동하게 하고, 로그인 성공 시 쿠키를 획득하게 하여 쿠키가 있을 경우 루트 페이지에서 로그인 성공 화면을 띄우려고 했다. 아직 DB 연결 전이라 간단하게 조건문을 이용해서 내가 설정한 id와 password가 같은 경우에 쿠키를 획득하게 했다.

 

코드를 보면 GET 메소드가 2개가 있고 둘 다 '/login'을 get 하면 실행된다. 같은 상황일 때 2개의 응답을 보내려고 하니 위와 같은 에러가 발생한 것이다.

 

코드를 수정하면 아래와 같다.


다른 경우도 살펴보겠다.

router.get("/", (req, res) => {
  if (req.user) {
    res.send(`${req.user.name}님 환영합니다!`);
  }
  res.send("로그인 후 이용해주세요.");
});

이 경우에는 req.user의 값이 있으면 req.user 값에 있는 name 값을 포함해서 내보내고, req.user의 값이 없다면 "로그인 후 이용해 주세요."라는 문구를 내보내게 만들었다. 이때는 req.user의 값이 있을 때 에러가 발생하게 된다. if문 안에서의 응답을 한 번 보내고 if문을 빠져나와 아래 응답을 한 번 더 보내기 때문이다. 

 

두 가지 방법으로 코드를 수정할 수 있다.

router.get("/", (req, res) => {
  if (req.user) {
    return res.send(`${req.user.name}님 환영합니다!`);
  }
  return res.send("로그인 후 이용해주세요.");
});

위와 같이 return을 사용해 하나의 응답만 보내게 하는 방법이 있고,

router.get("/", (req, res) => {
  if (req.user) {
    res.send(`${req.user.name}님 환영합니다!`);
  } else res.send("로그인 후 이용해주세요.");
});

if else 문을 사용해서 둘 중 하나의 응답만 보내게 하는 방법이 있다.