컨트롤러는 서버로 들어오는 request를 처리하고 그에 맞는 response를 응답합니다

메타데이터를 설정할 수 있는 데코레이터에 대해 알아봅니다.라우팅에 대해 알아봅니다.nestjs에서 컨트롤러를 만드려면 class와 decorator를 사용합니다. decorator는 class와 메타데이터를 연결하고 라우팅을 가능하게 합니다.
import { Controller } from '@nestjs/common';
@Controller('')
export class Controller {
}
@기호로 컨트롤러 데코레이터를 선언합니다.컨트롤러는 라우팅을 통해 서버로 들어오는 request를 처리합니다.
라우트 경로를 설정하기 위해@Controller(path) 컨트롤러 데코레이터 안에 경로를 설정합니다.
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
}
@Controller('cats') 컨트롤러는 /cats경로로 들어오는 request를 처리합니다.HTTP request method 중 GET 메서드를 처리하기 위해서는 @Get() 데코레이터를 사용합니다.
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
GET /cats 요청이 오면 findAll() 핸들러가 처리하게 됩니다.GET /cats/all 경로를 설정해주고 싶다면 @Get('all')을 해주면 됩니다.@Get() @Post() @Put()등이 있습니다.위 코드에서 GET /cats 요청을 처리하는 handler인 findAll() request handler를 정의했습니다.
nestjs에서 request handler는 다음과 같은 특성을 가집니다.
object 또는 array라면 자동으로 JSON으로 변환하여 응답하게 됩니다.Primitive 값이라면 값 그 자체를 반환하게 됩니다. 서버에서 응답을 처리하기 위해서 request의 정보를 알아야할 때가 있습니다. 이때 request object를 사용합니다. request object를 사용하기 위해서는 @Req 데코레이터가 필요합니다.
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';
}
}
응답을 처리하는 response의 기본 상태 코드는 200입니다. (POST 요청에 대한 상태코드는 201입니다)
@HttpCode() 데코레이터를 추가하여 Status Cod를 바꿀 수 있습니다.
import {HttpCode} from '@nestjs/common'
@Post()
@HttpCode(204) // 204 상태코드를 응답합니다
create() {
return 'This action adds a new cat';
}
Header를 커스텀하여 응답하기 위해서는 @Header() 데코레이터를 사용합니다.
import {Header} from "@nestjs/common"
@Post()
@Header('Cache-Control', 'none')
create() {
return 'This action adds a new cat';
}
요청에 대해 redirect 하기 위해서는 @Redirect() 데코레이터를 사용하거나 response object의 redirect()메서드를 사용합니다.
@Get()
@Redirect('https://nestjs.com', 301)
findAll(){
return ...
}
@Redirect(url,statusCode) 데코레이터는 redirect할 url과 statusCode가 필요합니다.statusCode를 지정하지 않는 경우 기본값은 302 상태코드로 응답됩니다.만약 동적으로 변하는 url 또는 statusCode를 반환하고 싶다면 request handler가 다음 객체형태를 반환하도록 합니다.
{
"url" : redirection URL,
"statusCode" : statusCode
}
request handler가 위 객체를 반환하면 이미 선언된 @Redirect()를 오버라이드해서 값을 리턴합니다.
@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version) {
if (version && version === '5') {
return {
url: 'https://docs.nestjs.com/v5/',
statusCode : 301
};
}
}
Query version을 확인해 조건을 만족하면 @Redirct를 오버라이드해서 반환합니다.