Xây dựng Logic Nghiệp vụ với NestJS Service

Trong mô hình kiến trúc Layered Architecture (Kiến trúc phân tầng) của NestJS, Service (hoặc Provider) đóng vai trò là “trái tim” của ứng dụng. Đây là nơi chứa toàn bộ Business Logic (Nghiệp vụ) của hệ thống. Tài liệu này tổng hợp cấu trúc của một NestJS Service, liệt kê các phương thức thường xuyên xuất hiện và hướng dẫn bạn cách viết prompt để Claude Code sinh ra các Service hoạt động ổn định, an toàn và chuyên nghiệp nhất.

Vai trò của tầng Service

Service đứng ở giữa để phối hợp hoạt động giữa đầu nhận HTTP Request (Controller) và tầng lưu trữ dữ liệu (Repository):
Quy tắc vàng: Controller tuyệt đối không được truy cập trực tiếp DB hoặc chứa logic nghiệp vụ phức tạp. Nó chỉ nhận dữ liệu, chuyển tiếp cho Service và trả lại kết quả. Toàn bộ logic kiểm tra điều kiện, tính toán, mã hóa mật khẩu… phải nằm ở Service.

Các phương thức cốt lõi thường dùng trong Service

Một Service quản lý nghiệp vụ chuẩn thường chứa các nhóm phương thức sau:

1. Nhóm Nghiệp vụ CRUD tiêu chuẩn

Đây là các phương thức căn bản tương ứng với các tác vụ RESTful API:
  • create(createDto): Tiếp nhận dữ liệu, kiểm tra các ràng buộc nghiệp vụ (ví dụ: email đã tồn tại chưa), mã hóa dữ liệu nhạy cảm, và lưu thông qua Repository.
  • findAll(queryDto): Trả về danh sách dữ liệu, thường tích hợp logic phân trang (pagination), tìm kiếm (search) và lọc dữ liệu (filter).
  • findOne(id): Lấy chi tiết bản ghi, kiểm tra sự tồn tại và tự động ném ra lỗi NotFoundException nếu không tìm thấy.
  • update(id, updateDto): Lấy dữ liệu cũ, xử lý cập nhật các thuộc tính và lưu lại.
  • remove(id): Kiểm tra các ràng buộc trước khi xóa (ví dụ: danh mục này có chứa sản phẩm nào không) rồi tiến hành xóa.

2. Nhóm Nghiệp vụ Đặc thù (Domain Logic)

Bên cạnh CRUD, Service chứa các logic luồng công việc phức tạp hơn:
  • register(registerDto): Đăng ký tài khoản mới (hash password bằng bcrypt, kiểm tra trùng lặp email, gửi email chào mừng).
  • validateUser(email, password): Kiểm tra tài khoản và mật khẩu có khớp nhau hay không để phục vụ đăng nhập.
  • verifyEmailToken(token): Xác thực tài khoản người dùng thông qua mã token gửi qua email.

Ví dụ cấu trúc Service Toàn diện

Dưới đây là mã nguồn của một UsersService tiêu chuẩn, phối hợp xử lý lỗi bằng các Exception được NestJS cung cấp sẵn (ConflictException, NotFoundException):
src/users/users.service.ts

Hướng dẫn viết Prompt để Claude Code thiết kế Service hoàn hảo

Để Claude Code tự động viết một Service có cấu trúc chặt chẽ và bảo mật cao, bạn nên cung cấp đầy đủ các quy tắc nghiệp vụ trong Prompt.

Prompt mẫu chuẩn thiết kế Service:

Hãy luôn yêu cầu Claude Code sử dụng đúng các HTTP Exceptions có sẵn của @nestjs/common (như BadRequestException, ForbiddenException, ConflictException, NotFoundException) để lỗi trả về cho Client luôn đi kèm đúng HTTP Status Code tiêu chuẩn.