Class 02: Routing, Controller và Dependency Injection
Tổng quan bài học
Trong bài này, chúng ta sẽ học cách xây dựng các route trong NestJS thông qua Controller, truyền và nhận dữ liệu qua DTO, và hiểu cơ chế Dependency Injection (DI) – một trong những đặc điểm nổi bật của NestJS giúp quản lý các thành phần và tăng khả năng mở rộng của ứng dụng.
Controller và Route trong NestJS
Controller là gì?
Trong NestJS, Controller chịu trách nhiệm xử lý các request từ client và trả về response tương ứng. Mỗi controller sẽ định nghĩa các route như GET, POST, PUT, DELETE.
Cú pháp khai báo Controller
import { Controller, Get } from '@nestjs/common';
@Controller('hello') // Prefix route: /hello
export class HelloController {
@Get() // Route: GET /hello
getHello(): string {
return 'Xin chào từ NestJS!';
}
}Các decorator xử lý route:
@Get()
GET
Lấy dữ liệu
@Post()
POST
Thêm dữ liệu mới
@Put()
PUT
Cập nhật toàn bộ dữ liệu
@Patch()
PATCH
Cập nhật một phần dữ liệu
@Delete()
DELETE
Xóa dữ liệu
@Param()
Lấy giá trị từ URL
@Body()
Lấy dữ liệu từ body request
@Query()
Lấy dữ liệu từ query string
Ví dụ đầy đủ:
DTO (Data Transfer Object)
DTO là các class đơn giản dùng để định nghĩa cấu trúc dữ liệu truyền vào/từ controller. Ở bài này, bạn chỉ cần tạo DTO mà không cần validation.
Giới thiệu Dependency Injection
NestJS sử dụng Dependency Injection (DI) để quản lý các phụ thuộc giữa các class (như Service, Repository…). Thay vì tự tạo instance của service, NestJS sẽ inject tự động khi ta khai báo trong constructor.
Tạo Service
Tạo ra file users.service.ts:
Sử dụng Service trong Controller
Bài tập thực hành
Mục tiêu
Tạo một module users đơn giản để quản lý danh sách người dùng bao gồm các API sau:
GET /users– Lấy danh sách người dùngGET /users/:id– Lấy thông tin người dùng theo IDPOST /users– Tạo người dùng mới (gồm name, age)PUT /users/:id– Cập nhật người dùngDELETE /users/:id– Xoá người dùng
Yêu cầu
Sử dụng
Serviceđể quản lý dữ liệu người dùng (lưu trữ trong mảng đơn giản)Tạo 2 DTO:
CreateUserDto,UpdateUserDto(không cần dùngclass-validator)Không cần kết nối cơ sở dữ liệu
Gợi ý mở rộng
Sau khi hoàn thành, bạn có thể mở rộng:
Thêm logic kiểm tra người dùng tồn tại trước khi cập nhật/xoá
Sử dụng
Mapthay vì mảngBổ sung tính năng tìm kiếm người dùng theo tên
Last updated