☰ Mục lục series
Tài liệu NestJS tiếng Việt
  1. Nhập môn (Overview)
    1. Giới thiệu
    2. First steps
    3. Controllers
    4. Providers
    5. Modules
    6. Middleware
    7. Exception filters
    8. Pipes
    9. Guards
    10. Interceptors
    11. Custom decorators
  2. Nền tảng (Fundamentals)
    1. Custom providers
    2. Asynchronous providers
    3. Dynamic modules
    4. Injection scopes
    5. Circular dependency
    6. Module reference
    7. Lazy-loading modules
    8. Execution context
    9. Lifecycle events
    10. Discovery service
    11. Platform agnosticism
    12. Testing
  3. Kỹ thuật (Techniques)
    1. Configuration
    2. Database (SQL)
    3. MongoDB
    4. Validation
    5. Caching
    6. Serialization
    7. Versioning
    8. Task scheduling
    9. Queues
    10. Logging
    11. Cookies
    12. Events
    13. Compression
    14. File upload
    15. Streaming files
    16. HTTP module
    17. Session
    18. MVC
    19. Performance (Fastify)
    20. Server-Sent Events
  4. Bảo mật (Security)
    1. Authentication
    2. Authorization
    3. Encryption & Hashing
    4. Helmet
    5. CORS
    6. CSRF
    7. Rate limiting
    8. Vòng đời request
  5. OpenAPI (Swagger)
    1. Introduction
    2. Types and parameters
    3. Operations
    4. Security
    5. Mapped types
    6. Decorators
    7. CLI plugin
    8. Other features
  6. Recipes
    1. REPL
    2. CRUD generator
    3. SWC (fast compiler)
    4. Passport (auth)
    5. Hot reload
    6. MikroORM
    7. Router module
    8. Health checks (Terminus)
    9. CQRS
    10. Prisma
    11. Serve static
    12. Commander
    13. Async local storage
  7. WebSockets
    1. Gateways
    2. Exception filters
    3. Pipes
    4. Guards
    5. Interceptors
    6. Adapters
  8. Microservices
    1. Overview
    2. Redis
    3. MQTT
    4. NATS
    5. RabbitMQ
    6. Kafka
    7. gRPC
    8. Custom transporters
    9. Exception filters
    10. Pipes
    11. Pre-request hooks
    12. Guards
    13. Interceptors
  9. GraphQL
    1. Quick start
    2. Resolvers
    3. Mutations
    4. Subscriptions
    5. Scalars
    6. Directives
    7. Interfaces
    8. Unions and enums
    9. Field middleware
    10. Mapped types
    11. Plugins
    12. Complexity
    13. Extensions
    14. CLI plugin
    15. Generating SDL
    16. Sharing models
    17. Other features
    18. Federation
  10. CLI & triển khai
    1. CLI overview
    2. Workspaces
    3. Libraries
    4. Usage
    5. Scripts
    6. Deployment
    7. Standalone apps
  11. FAQ
    1. Serverless
    2. HTTP adapter
    3. Keep-Alive connections
    4. Global path prefix
    5. Raw body
    6. Hybrid application
    7. HTTPS & multiple servers
    8. Common errors
  12. Phụ lục
    1. Bảng thuật ngữ
CLI & triển khai

Tổng quan (Overview)

Bản dịch từ docs.nestjs.com/cli/overview

Nest CLI là một công cụ dòng lệnh (command-line interface) giúp bạn khởi tạo, phát triển và bảo trì các ứng dụng Nest. Nó hỗ trợ theo nhiều cách, bao gồm scaffold dự án, chạy dự án ở chế độ development, và build, đóng gói ứng dụng để phân phối cho production. Nest CLI áp dụng các pattern kiến trúc best-practice để khuyến khích bạn xây dựng ứng dụng có cấu trúc tốt.

Cài đặt (Installation)

Lưu ý: Trong hướng dẫn này, chúng tôi mô tả cách dùng npm để cài package, bao gồm cả Nest CLI. Bạn có thể dùng package manager khác tùy ý. Với npm, bạn có nhiều lựa chọn để quản lý cách dòng lệnh OS của bạn phân giải vị trí của file binary nest CLI. Ở đây, chúng tôi mô tả cách cài binary nest toàn cục (global) bằng option -g. Cách này tiện lợi, và là cách tiếp cận chúng tôi giả định xuyên suốt tài liệu. Lưu ý rằng việc cài bất kỳ package npm nào ở phạm vi toàn cục đồng nghĩa với việc bạn phải tự chịu trách nhiệm đảm bảo đang chạy đúng phiên bản. Điều này cũng có nghĩa là nếu bạn có nhiều dự án khác nhau, mỗi dự án sẽ chạy cùng một phiên bản CLI. Một lựa chọn thay thế hợp lý là dùng chương trình npx (đi kèm sẵn trong npm cli, hoặc tính năng tương tự ở package manager khác) để đảm bảo bạn chạy một phiên bản được quản lý của Nest CLI. Chúng tôi khuyến nghị bạn tham khảo tài liệu npx và/hoặc đội DevOps hỗ trợ để biết thêm chi tiết.

Ghi chú người dịch Đây gần giống chuyện chọn cài Go binary qua go install (global, dùng chung version cho mọi project) hay chạy trực tiếp qua go run (luôn dùng version khai báo trong go.mod). npx @nestjs/cli@latest giống go run ở chỗ nó tải và chạy đúng version bạn chỉ định mà không cần cài global, tránh tình trạng “máy tôi chạy version cũ, máy bạn chạy version mới”.

Cài CLI toàn cục bằng lệnh npm install -g (xem phần Lưu ý ở trên để biết chi tiết về việc cài global).

$ npm install -g @nestjs/cli

Gợi ý Ngoài ra, bạn có thể dùng lệnh npx @nestjs/cli@latest mà không cần cài cli toàn cục.

Quy trình cơ bản (Basic workflow)

Sau khi cài đặt, bạn có thể gọi các lệnh CLI trực tiếp từ dòng lệnh OS thông qua file thực thi nest. Xem danh sách các lệnh nest có sẵn bằng cách nhập:

$ nest --help

Xem trợ giúp cho một lệnh cụ thể bằng cú pháp sau. Thay bất kỳ lệnh nào, như new, add, v.v., vào vị trí generate trong ví dụ dưới đây để xem trợ giúp chi tiết cho lệnh đó:

$ nest generate --help

Để tạo, build và chạy một dự án Nest cơ bản mới ở chế độ development, hãy vào thư mục sẽ là thư mục cha của dự án mới, rồi chạy các lệnh sau:

$ nest new my-nest-project
$ cd my-nest-project
$ npm run start:dev

Lệnh new sẽ hỏi bạn chọn một module format. Các dự án ESM được tạo sẵn với Vitest và oxlint theo mặc định.

Trong trình duyệt, mở http://localhost:3000 để xem ứng dụng mới đang chạy. Ứng dụng sẽ tự động biên dịch lại và reload khi bạn thay đổi bất kỳ file source nào.

Gợi ý Chúng tôi khuyến nghị dùng SWC builder để build nhanh hơn (nhanh hơn 10 lần so với TypeScript compiler mặc định).

Cấu trúc dự án (Project structure)

Khi bạn chạy nest new, Nest sẽ tạo ra một cấu trúc ứng dụng boilerplate bằng cách tạo một folder mới và điền vào đó một bộ file ban đầu. Bạn có thể tiếp tục làm việc trong cấu trúc mặc định này, thêm các component mới, như mô tả xuyên suốt tài liệu này. Chúng ta gọi cấu trúc dự án được tạo bởi nest new là standard mode. Nest cũng hỗ trợ một cấu trúc khác để quản lý nhiều dự án và library, gọi là monorepo mode.

Ngoại trừ một vài điểm khác biệt cụ thể về cách quá trình build hoạt động (về cơ bản, monorepo mode đơn giản hóa các phức tạp trong build đôi khi phát sinh từ cấu trúc dự án kiểu monorepo), và hỗ trợ library tích hợp sẵn, phần còn lại của các tính năng Nest, cũng như tài liệu này, áp dụng như nhau cho cả cấu trúc dự án standard và monorepo mode. Trên thực tế, bạn có thể dễ dàng chuyển từ standard mode sang monorepo mode bất cứ lúc nào trong tương lai, nên bạn hoàn toàn có thể tạm hoãn quyết định này trong lúc vẫn đang tìm hiểu Nest.

Bạn có thể dùng bất kỳ mode nào để quản lý nhiều dự án. Dưới đây là tóm tắt nhanh sự khác biệt:

Tính năng Standard Mode Monorepo Mode
Nhiều dự án Cấu trúc file system riêng biệt Một cấu trúc file system duy nhất
node_modules & package.json Các instance riêng biệt Dùng chung trong toàn monorepo
Compiler mặc định tsc rspack
Cấu hình compiler Chỉ định riêng biệt Cấu hình mặc định cho cả monorepo, có thể override theo từng dự án
File cấu hình lint và formatter Chỉ định riêng biệt Dùng chung trong toàn monorepo
Lệnh nest build và nest start Mặc định nhắm vào dự án (duy nhất) trong context Mặc định nhắm vào dự án mặc định (default project) trong monorepo
Library Quản lý thủ công, thường qua đóng gói npm Hỗ trợ tích hợp sẵn, bao gồm quản lý path và bundling

Ghi chú người dịch Nếu bạn từng dùng Nx, Turborepo, hay Lerna ở phía frontend/Node, monorepo mode của Nest CLI làm việc tương tự nhưng gói gọn hơn nhiều: mọi thứ được điều phối bởi một file nest-cli.json duy nhất thay vì một hệ sinh thái plugin riêng. So với Go workspaces (go.work) — nơi bạn ghép nhiều module lại để share code mà vẫn build độc lập — ý tưởng cốt lõi là giống nhau: một root dùng chung, nhiều project con.

Đọc các phần Workspaces và Libraries để biết thông tin chi tiết hơn, giúp bạn quyết định mode nào phù hợp nhất.

Cú pháp lệnh CLI (CLI command syntax)

Tất cả lệnh nest đều tuân theo cùng một định dạng:

nest commandOrAlias requiredArg [optionalArg] [options]

Ví dụ:

$ nest new my-nest-project --dry-run

Ở đây, new là commandOrAlias. Lệnh new có alias là n. my-nest-project là requiredArg. Nếu requiredArg không được cung cấp trên dòng lệnh, nest sẽ hỏi lại bạn. Ngoài ra, --dry-run có dạng rút gọn tương đương là -d. Với điều này, lệnh sau đây tương đương với lệnh ở trên:

$ nest n my-nest-project -d

Hầu hết các lệnh, và một số option, đều có alias. Hãy thử chạy nest new --help để xem các option và alias này, đồng thời xác nhận lại hiểu biết của bạn về các cấu trúc trên.

Tổng quan các lệnh (Command overview)

Chạy nest <command> --help cho bất kỳ lệnh nào dưới đây để xem các option riêng của lệnh đó.

Xem usage để biết mô tả chi tiết cho từng lệnh.

Lệnh Alias Mô tả
new n Scaffold một ứng dụng standard mode mới, với đầy đủ các file boilerplate cần thiết để chạy.
generate g Tạo và/hoặc sửa file dựa trên một schematic.
build Biên dịch một ứng dụng hoặc workspace vào một thư mục output.
start Biên dịch và chạy một ứng dụng (hoặc dự án mặc định trong workspace).
add Import một library đã được đóng gói dưới dạng nest library, chạy install schematic của nó.
upgrade update Nâng cấp một dự án hiện có lên phiên bản major NestJS mới nhất.
deploy Deploy ứng dụng của bạn lên cloud, được cung cấp bởi Mau.
info i Hiển thị thông tin về các package nest đã cài và các thông tin hệ thống hữu ích khác.

Yêu cầu hệ thống (Requirements)

Bản thân binary CLI chạy trên Node.js v20.11 trở lên, nhưng các schematic đứng sau nest new, nest generate, và nest upgrade (@nestjs/schematics) yêu cầu Node.js v22.22.3+, v24.15+, hoặc v26+. Chạy một ứng dụng Nest thì yêu cầu thấp hơn thế — xem migration guide để biết chi tiết đầy đủ — nên nếu bạn sinh code trên cùng máy bạn phát triển, hãy dùng bản LTS đang được hỗ trợ mới nhất.

Ghi chú người dịch Việc tách yêu cầu Node.js thành hai mức (chạy app thấp hơn, chạy schematic cao hơn) khá giống việc một số framework Go tách requirement giữa “chạy binary đã build” và “build từ source” — binary chạy được trên hệ thống cũ hơn máy build ra nó. Ở đây lý do là schematics dùng các API/ES feature mới hơn của Node để sinh code, còn app runtime của Nest thì tương thích ngược rộng hơn.

Nest CLI cũng yêu cầu một bản Node.js được build kèm hỗ trợ quốc tế hóa (ICU), như các bản chính thức từ trang chủ dự án Node.js. Nếu bạn gặp lỗi liên quan đến ICU, hãy kiểm tra xem binary của bạn có đáp ứng yêu cầu này không.

node -p process.versions.icu

Nếu lệnh này in ra undefined, nghĩa là binary Node.js của bạn không có hỗ trợ quốc tế hóa.

Nội dung gốc: NestJS Documentation © Kamil Myśliwiec, giấy phép MIT. Bản dịch và ghi chú: Lê Văn Dũng.