NestJS 공식문서의 Controller 개념 공부 2번째 포스트로, Controller의 Request object를 주제로 작성한다.
핸들러가 클라이언트 요청 세부사항에 대해 접근해야 될 경우가 종종 있다. Nest는 기본 플랫폼(기본적으로 Express)의 요청 객체에 대한 접근을 제공한다. 핸들러에 @Req() 데코레이터를 추가해 Nest가 요청 객체를 핸들러에 주입하도록 지시하면 요청 객체에 접근할 수 있다.
import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';
@Controller('cats')
export class CatsController {
@Get()
findAll(@Req() request: Request): string {
return 'This action returns all cats';
}
}
요청 객체는 HTTP 요청을 나타내고 '요청 쿼리 스트링', '파라미터', 'HTTP 헤더', '바디' 등과 같은 프로퍼티를 갖는다. 대부분의 경우, 이런 프로퍼티들을 수동으로 잡아낼 필요는 없다. 대신 바로 사용할 수 있는 @Body() 또는 @Query() 같은 전용 데코레이터를 사용할 수 있다. 아래 리스트는 제공되는 데코레이터와 데코레이터가 나타내는 플랫폼-특정 객체의 리스트이다.
@Request(), @Req() - req@Response(), @Res() - res@Next() - next@Session() - req.session@Param(key?: string) - req.params / req.params[key]@Body(key?: string) - req.body / req.body[key]@Query(key?: string) - req.query / req.query[key]@Headers(name?: string) - req.headers / req.headers[name]@Ip() - req.ip@HostParam() - req.hosts기본 HTTP 플랫폼(Express와 Fastify) 간 타입 호환성을 위해, Nest는 @Res()와 @Response() 데코레이터를 제공한다. @Res()는 @Response()를 다르게 표현한 것이다. 두 데코레이터 모두 기본 플랫폼 response 객체 인터페이스를 노출시킨다. 두 데코레이터를 최대한 활용하려면 기본 라이브러리(@types/express)에 대한 타입도 임포트해야 한다.
메서드 핸들러에 @Res() 또는 @Response()를 주입하는 경우 해당 핸들러에 대해 Nest를 라이브러리-특정 모드로 설정하게 되므로 해당 핸들러의 응답을 직접 관리해야 한다. 핸들러의 응답을 직접 관리하는 경우, res.json() 또는 res.send()와 같이 response 객체를 호출해 응답을 돌려주어야 한다. 그렇지 않으면 HTTP 서버가 중단된다.