ERR_HTTP_HEADERS_SENT
오류는 서버가 클라이언트에게 둘 이상의 응답을 보내려고 할 때 발생하는 오류
[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
처음에 이런 에러를 보았을 땐 매우 당황했다. 처음 보는 에러였고, 정확히 어디서 문제가 있는지 알 수가 없어 에러를 천천히 보고 구글링을 했다.
클라의 요청에 내(서버)가 둘 이상의 응답을 보내면 나타나는 오류라고 한다.
음... 난 분명히 응답을 하나만 했을 텐데.. 왜냐하면 res.status().json({})으로 응답을 보내줄 때 항상 return문을 붙여주니까 2개 이상이 가지 않을 것이라 생각했다.
문제는 내 미들웨어에 있었다. 로그인 유무를 확인하는 미들웨어를 만들어서 api통신을 하기 전에 미들웨어에서 토큰 값을 기반으로 로그인 유무를 확인했는데 그때 한번 응답을 하고, api통신에서 또 응답을 보내준 것 같다.
미들웨어의 return 하나가 잘못된 위치에 있었다.
그 부분만 수정해주니 다시 정상적으로 작동했다.
이와 관련해서 여러 블로그들을 보았는데
1. 응답 과정에서 return을 제대로 하지 않은 경우
// 예시
if (!req.body.name) {
return res.status(400).json({
status: 'error',
error: 'req body cannot be empty',
});
}
2. 여러 개의 if문 사용 시 else를 제대로 사용하지 않았을 경우
// 예시
app.post('/login', async (req, res) => {
/* 변수 선언 등등*/
if{
/* 변수 처리문 */
return res.status(201).json({
/* 응답 메시지 */
});
}
return res.status(201).json({
/* 응답 메시지 */
});
});
3. 반복문을 돌면서 응답을 할 경우
const selectQuery = connection.query('select user_id from users',(err,rows)=>{
if(err){
throw err;
}else{
//결과값을 배열로 가져오기때문에 체크해줘야함
for(let i=0; i<rows.length;i++){
if(user_id === rows[i].user_id){
res.json({message : '400 Bad Request'})
}
}
}
});
등 말 그대로 응답을 여러 번 할 경우 생기는 에러다.
해결은 간단하게 return을 잘 찍어주거나,
if문 사용 시 else 사용,
반복문 안에서 응답하지 않기 등
해결은 간단하게 1번의 요청에는 1번만 응답해주기
'coding > Error' 카테고리의 다른 글
multer, S3 - this.client.send is not a function (0) | 2022.09.11 |
---|---|
npm - "minor" / "23 packages are looking for funding" 에러 (0) | 2022.09.08 |
인스턴스 접속 에러 (0) | 2022.08.19 |
외래키 설정 (0) | 2022.08.14 |
함수의 {return } (0) | 2022.08.04 |