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 서버가 중단된다.