Express를 사용해서 작업할 때 요청 및 응답 객체에 접근할 수 있는데, 응답을 요청한 쪽에 다시 보낼 수 있다.
이 경우 Express에서는res.json()
, res.send()
, res.end()
와 같은 메서드를 사용할 수 있다..
어떤 걸 써야하는 지 가끔 헷갈릴 때가 있어 정리하고자 한다.
구글 엔지니어 타마스 피로스의 글을 참고했다.
응답 객체는 노드의 핵심 객체인 http.ServerResponse의 인스턴스이다.
응답 객체는 요청 핸들러의 두 번째 매개변수로 사용된다.
이름은 원하는 대로 바꿀 수 있지만 보통 res
, resp
, response
를 사용한다.
Express 서버가 HTTP 요청을 받으면 response를 반환한다.
app.get('/api/test', (req, res) => {
// write code..
}
기본적으로 res.send()
메서드를 호출하여 응답response을 보낼 수 있다.
서버에서 response 처리를 할 때 content-type을 지정해주어야 한다.
res.send()
메서드는 res.send(body)
형태로 사용할 수 있다.
body 인자에는 Buffer
, String
, Object
, Array
를 사용할 수 있다.
res.send() 메서드는 전달된 body argument에 따라 content-type이 자동적으로 만들어진다.
기본 컨텐츠 타입은 text/html이다.
res.type()
메서드를 호출해서 content-type 응답 헤더를 따로 설정해 줄 수 있다.
res.send()
메서드로 JSON 형식의 데이터를 전송해보자.
app.get('/api/test', (req, res) => {
res.send({ hello: 'world' });
});
응답 헤더
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 17
ETag: W/"11-IkjuL6CqqtmReFMfkkvwC0sKj04"
Date: Thu, 2 Sep 2021 22:40:43 GMT
Connection: keep-alive
Express가 정상적으로 컨텐츠 타입을 설정했음을 알 수 있다.
res.send()로 잘 보내는데 res.json()을 굳이 사용해야 할까?
res.json()
은 res.send()
로 JSON형태의 데이터를 보낼 때 사용할 수 없는 몇가지 기능이 있다.
두 가지 옵션을 통해 반환할 JSON데이터의 형식을 정해줄 수 있다.
app.set('json replacer', replacer);
// JSON 문자열에 포함시킬 객체의 프로퍼티를 지정해주는 옵션
app.set('json spaces', 2);
// 들여쓰기 공백 수 지정
이 두 가지 옵션은 수집되어 내부적으로 JSON.stringify(object, replacer, space)
와 같은 형식으로 전달된다.
그 후 res.json()
메서드 내부에서 res.send()
메서드가 호출되어 전송된다.
응답 관련된 모든 작업이 끝나고 세션을 종료하기 위해서는 res.end()
메서드를 호출해야 한다.
res.end()
는 모든 경우에 필수적인 메서드는 아니다.
데이터를 전송하지 않고 종료하려면 그냥 res.end()
를 사용하면 된다.
404 상태를 보낼 때 유용하게 사용할 수 있다.
// 상태코드 404로 설정하고 그 후 응답을 바로 종료.
res.status(404).end();
res.json()
메서드는 JSON타입 데이터에 대해 형식을 추가 설정할 수 있다.
이런 옵션이 필요하지 않을 경우 res.send()
를 사용하여 응답 객체를 반환하면 된다.
res.json()
과 res.send()
, 두 가지 메서드 모두 데이터를 전송한 후 세션을 종료하므로 추가적으로 res.end()
메서드를 호출할 필요가 없다.