컨트롤러는 들어오는 요청 request를 처리하고 응답 response를 클라이언트에 반환한다.
기본 컨트롤러를 만들기 위해 클래스와 데코레이터를 사용한다. 데코레이터는 클래스를 필수 메타데이터와 연결하고 Nest가 라우팅 맵을 만들 수 있도록 한다.
라우팅
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
@Get() 데코레이터는 특정 엔드포인트에 대한 핸들러를 생성함. Controller 데코레이터의 인자를 접두사로, Get의 인자와 합쳐서 엔드포인트를 생성. 해당 엔드포인트의 요청이 오면 fildAll이라는 메서드에 라우팅한다. findAll이라는 메서드 이름에는 아무 의미가 없음.
Express, fasify 호환성을 위해 req, res와 같은 객체들도 @Req, @Res 등 데코레이터로 사용한다.
(param, redirect, host 등등)
비동기 요청의 경우 Promise를 리턴한다.
Request payload
POST 라우트 핸들러의 매개변수를 사용하기 위해 먼저 DTO 스키마를 결정한다. DTO는 데이터가 네트워크를 통해 전송되는 방식을 정의하는 객체이다. ts 인터페이스를 사용하거나 간단한 클래스를 사용하여 DTO 스키마를 확인할 수 있다. 클래스를 사용하는게 더 좋다고 함. 컴파일 후에도 실제 엔티티로 유지되니까
export class CreateCatDto {
name: string;
age: number;
breed: string;
}
// controller
@Post()
async create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
예제
import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';
@Controller('cats')
export class CatsController {
@Post()
create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
@Get()
findAll(@Query() query: ListAllEntities) {
return `This action returns all cats (limit: ${query.limit} items)`;
}
@Get(':id')
findOne(@Param('id') id: string) {
return `This action returns a #${id} cat`;
}
@Put(':id')
update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
return `This action updates a #${id} cat`;
}
@Delete(':id')
remove(@Param('id') id: string) {
return `This action removes a #${id} cat`;
}
}
컨트롤러는 항상 모듈에 속한다. 모듈 데코레이터 내에 controllers 배열을 등록하면 Nest는 컨트롤러를 마운트 시킨다.
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
@Module({
controllers: [CatsController],
})
export class AppModule {}
Loading Comments...