NestJS Fundamentals: Understanding Controllers

#nestjs

Controllers

Controllers chịu trách nhiệm xử lý các requests đến và gửi responses trả lại cho client.

[Image of NestJS Controller request response flow]

Mục đích của một controller là tiếp nhận các yêu cầu cụ thể cho ứng dụng. Cơ chế routing sẽ quyết định controller nào nhận request nào. Thông thường, một controller có nhiều route và mỗi route thực hiện một hành động khác nhau.

Để tạo một controller cơ bản, chúng ta sử dụng class và decorators. Decorators liên kết các class với metadata cần thiết để Nest tạo ra bản đồ định tuyến.

info Hint: Để tạo nhanh một CRUD controller, bạn có thể dùng lệnh CLI: nest g resource [name].

Routing

Sử dụng decorator @Controller('cats') để xác định tiền tố (prefix) cho các route bên trong class đó.

typescript
import { Controller, Get } from '@nestjs/common';
 
@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

Request object

Nest cung cấp quyền truy cập vào đối tượng request của nền tảng bên dưới (mặc định là Express). Bạn có thể sử dụng các decorator chuyên dụng để lấy dữ liệu:

DecoratorĐối tượng tương ứng
@Request(), @Req()req
@Body()req.body
@Param(key?)req.params
@Query(key?)req.query
@Headers()req.headers

Status code

Mặc định, status code luôn là 200, riêng POST là 201. Bạn có thể thay đổi bằng decorator @HttpCode().

typescript
@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}

Route parameters

Sử dụng token trong đường dẫn để chấp nhận dữ liệu động từ URL.

typescript
@Get(':id')
findOne(@Param('id') id: string): string {
  return `This action returns a #${id} cat`;
}

Request payloads (DTO)

Trước khi xử lý POST request, chúng ta nên định nghĩa DTO (Data Transfer Object) bằng class để đảm bảo dữ liệu hợp lệ.

typescript
export class CreateCatDto {
  name: string;
  age: number;
  breed: string;
}

Khai báo Module

Đăng ký controller vào mảng controllers trong @Module().

typescript
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
 
@Module({
  controllers: [CatsController],
})
export class AppModule {}

Bài viết liên quan