V-logue

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

Error

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

보그 2022. 6. 27. 16:00

Node로 코드를 짜다보면 은근히 흔하게 볼 수 있는 에러의 종류인데,

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

에러가 뜨는 원인이 내가 찾은 해답을 제외하고도 또 있을 수 있겠지만,

 

아마도... 주로... 구글로 찾아보니..

 

서버가 클라이언트에게 둘 이상의 응답을 보내려고 할 때 뜨는 에러일 확률이 상당히 높다.

 

router.get('/auth', authMiddleware, async(req, res) => {
  try {
  const user = res.locals.user
  if(user === undefined) {
    res.status(401).json({ errorMessage: "로그인이 필요합니다."})
  } 
  const existUser = await User.find();
  res.status(200).json( existUser )
  } catch(err) {
    if(err){
      console.log(err)
      res.status(400).json({ errorMessage: "유저 정보를 찾을 수 없습니다."})
    }
  }
})

만약 위와 같은 코드가 있다고 한다면, 저 상태로 node를 실행시키고 

포스트맨으로 get요청을 받는다면

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

에러가 나타날 것이다.

 

위에서 둘 이상의 응답을 보내려고 할 때라고 설명했는데,

if(user === undefined) {
    res.status(401).json({ errorMessage: "로그인이 필요합니다."})
  } 
  const existUser = await User.find();
  res.status(200).json( existUser )
 // 바로 이부분이 문제다. if문 다음에 내보내려는 응답이 res.status(401)에서 끝나지 않고
 // 다음의 res.status(200)까지 이어져 응답을 두개를 연이어 보내려고 하는 모습이다.
 // 위와 같은 코드를 아래와 같이 고치면 문제는 해결된다.
 
 if(user === undefined) {
    res.status(401).json({ errorMessage: "로그인이 필요합니다."})
  } else {
  const existUser = await User.find();
  res.status(200).json( existUser )
  }
  // if문 다음에 else로 새로운 응답값을 내보낼 수 있게 만들어주면 된다.

위 코드박스에서 설명한 것처럼 하면 된다.

두개의 응답이 연이어서 나가려고 할 때 발생하는 것이기 때문에 응답값을 어떤 처리를 해줘서

별개의 응답으로 내보내면 된다.

Comments