JS Dev Blog
res.json() , res.end() , res.send() 본문
express를 사용해서 reqeust, response를 주고 받을 때
res.json(), res.end(), res.end() 중 어떤 것을 써야하는지 가끔 헷갈릴 때가 있다.
res.send()
res.send()는 response 처리할 때 Content-type을 알맞게 지정해준다. 이는 Buffer, String, Object, Array 일 수 있다.
res.json()
서버와 클라이언트간 데이터를 주고 받을 때 보통 RESTful API 형태로 주고 받는다. 이때 주고 받는 데이터 형식은 json 포맷일 확률이 높다. res.json()은 안에 들어있는 데이터들을 자동으로 json 형식으로 바꾸어 준다.
즉 content-type 헤더를 application/JSON으로 고정한다. 결국 res.json()도 res.send()를 보내준다. res.send()보다 더 작은 범위라고 생각하면 좋다.
res.end()
res.end()는 보내줄 데이터가 없는데 response를 끝내고 싶을 때 사용한다.
의문점
Logout 성공시'Logged out Successfully'라는 메시지를 response로 돌려주게끔 하는 코드를 작성했다.
module.exports = (req, res) => {
res.status(205).end('Logged out successfully') // 테스트 케이스 PASS
//res.status(205).send('Logged out successfully') // 테스트 케이스 FAIL. 이 코드가 맞는 것 같은데 왜 FAIL인지 모르겠음.
};
이를 테스트 하는 코드는 다음과 같다
describe('🚩 POST /signout', () => {
it('🧩 로그아웃 요청시 205 상태코드로 응답해야 합니다.', async () => {
const response = await agent.post('/signout');
expect(response.status).to.eql(205);
expect(response.text).to.eql('Logged out successfully');
});
});
아무리 봐도 res.send()를 쓰는 것이 맞아보이는데 res.send()를 쓸 경우 아래와 같은 에러를 띄우면서 테스트케이스 Pass가 안된다. 마치 아무런 텍스트 메시지도 반환하지 못하는 것처럼 보인다.
AssertionError: expected '' to deeply equal 'Logged out successfully'
res.end()를 쓸 경우 메시지가 정상출력되며 테스트케이스가 통과된다. 이유는 ... 모르겠다.
*21.5.1 추가
원인을 찾았다. express버전이 업데이트 되면서 status code가 205일 때 res.send()에 메시지를 전송하지 않도록 변경되었다. 원인으 찾았지만 여전히 res.end()를 쓸 때 테스트가 통과되는 이유는 모르겠다.
Release Change Log
4.18.0 - Release date: 2022-04-25
- The res.send() method will not attempt to send a response body when the response code is set to 205.
https://expressjs.com/en/changelog/4x.html
'Development > Server' 카테고리의 다른 글
서버 인증 (0) | 2022.04.23 |
---|---|
Express.js (0) | 2022.04.18 |