NestJS Fundamentals: Understanding Controllers
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 đó.
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().
@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.
@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ệ.
export class CreateCatDto {
name: string;
age: number;
breed: string;
}Khai báo Module
Đăng ký controller vào mảng controllers trong @Module().
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
@Module({
controllers: [CatsController],
})
export class AppModule {}