loading
본문 바로가기
ERROR CHECK/Back-end

[ node / Express ] 콜백중복호출 또는 바디오류

by pikiforyou 2020. 3. 5.

*에러코드

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


 

*발생이유

실수로 콜백 호출이 한번이 아니라 그 이상이 되거나,

바디(body)가 전송된 이후에 오류가 발생하는 경우 생기는 에러이다.

res.redirect 에서 문제가 생길수도있다.

For example, look for callbacks that are accidentally called twice, or any error that happens after the body is sen

 

 

*해결방법

중복처리가 제대로 된건지 확인할 필요가 있다.

보통은 if문, 반복문에 오류가 났을 가능성이 있으니 그쪽부터 보면 좋을것 같다

ex ) forEach문등 안에서 res.send 등을 쓰는것도 중복으로 진행되니 틀리는 경우이다.

 

*오류발생시 코드

  const user_id = Number(req.params.user_id);
  const requestBody = req.body;
  const targetUser = USERS.find(user => (user.id === user_id));

  if(!targetUser){
    res.status(400).json({ error: 'invalid user'});
  }

  let targetBody = Object.assign(targetUser, requestBody);

  res.json(targetBody);
  

틀린 요청이 들어왔을때 json방식으로 에러를 전달하는 내용을 작성한것이었다.

계속 /app.js 가장 마지막 하단에 적혀있는 에러핸들러의 'error'가 잘못되었다고 떠서 처음에 엄청 해맸었다. 

 

문제는 /app.js 에 적혀있는 에러처리코드를 바꾸면 안되는게 룰이었다.

그리고 그 코드는 오류를 템플릿을 렌더해서 보여주는 코드였기 때문이었다.

그렇지만 나는 json방식으로 넘기지않으면 코드가 통과하질 않았고... ( ... )

아까의 그 룰인 오류핸들러는 수정하면 안되었기때문에

next(Error) , next(create Error) 또는 throw new Error를 던져서 해결할수가없었다..

(해결할수도 있을수있으나... 현재의 내 상태에서는 찾을 수 없는 답이다..)

 

 

처음에는 이 코드안에서 try / catch 를 써서 통과를 하긴했었다.

  try {
    const user_id = Number(req.params.user_id);
    const targetUser = USERS.find(user => (user.id === user_id));

    if(!targetUser){
      throw new Error('invalid user');
    }

    let targetBody = Object.assign(targetUser, req.body);

    res.json(targetBody);

  } catch(err) {
    res.status(400).json({ error : err.message });
  }
  

오류함수로 넘길 수 없으니까 이 안에서 잡아서 해결하자는 생각으로 쓴 코드였고

오류코드없이 통과했다.

하지만 검색해보니 try/catch는 비동기(await, promise)등을 쓸때만 사용한다고 되어있기에

이 방법말고 다른 방법은 없나 다시 고민했다.

 

 

그리고 허탈하게도 정말로 간단하게 풀렸다. 

if문에서 보통 오류가 있다길래 유일하게 있는 if문을 다시 생각해보았다.

  if(!targetUser){
    res.status(400).json({ error: 'invalid user'});
  }
  

 

return 을 추가하고 오류는 해결되었다.

다시는 이런 실수를 하지않기위해 적는다.

 

  if(!targetUser){
    res.status(400).json({ error: 'invalid user'});
    return;
  }
  

 

 

 


- 궁금한 점 / 수정 요청사항 등은 언제든 댓글 달아주세요 :)

- 도움이 되셨다면 ❤️ 하트 한 번 눌러주세요! 감사합니다 ! 

 

 

'ERROR CHECK > Back-end' 카테고리의 다른 글

Tomcat Error Code (톰캣 오류코드)  (0) 2021.01.15
[node / express] req.param(name) 사용주의  (0) 2020.03.04

댓글