☰ 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ữ
Recipes

Router module

Bản dịch từ docs.nestjs.com/recipes/router-module

Gợi ý Chương này chỉ liên quan đến các ứng dụng dựa trên HTTP.

Trong một ứng dụng HTTP (ví dụ: REST API), route path của một hàm xử lý (route handler) được xác định bằng cách nối prefix (không bắt buộc) khai báo cho controller (bên trong decorator @Controller), với path được chỉ định trong decorator của method (ví dụ: @Get('users')). Bạn có thể tìm hiểu thêm về điều này trong phần này. Ngoài ra, bạn có thể định nghĩa một prefix toàn cục cho tất cả các route đăng ký trong ứng dụng, hoặc bật versioning.

Bên cạnh đó, có những trường hợp đặc biệt mà việc định nghĩa prefix ở cấp module (và do đó áp dụng cho tất cả controller đăng ký bên trong module đó) sẽ rất hữu ích. Ví dụ, hãy tưởng tượng một ứng dụng REST expose nhiều endpoint khác nhau được dùng bởi một phần cụ thể trong ứng dụng của bạn gọi là “Dashboard”. Trong trường hợp này, thay vì lặp lại prefix /dashboard trong từng controller, bạn có thể dùng module tiện ích RouterModule, như sau:

@Module({
  imports: [
    DashboardModule,
    RouterModule.register([
      {
        path: 'dashboard',
        module: DashboardModule,
      },
    ]),
  ],
})
export class AppModule {}

Gợi ý Class RouterModule được export từ package @nestjs/core.

Ngoài ra, bạn có thể định nghĩa cấu trúc phân cấp. Nghĩa là mỗi module có thể có các module children (module con). Các module con sẽ kế thừa prefix của module cha. Trong ví dụ dưới đây, chúng ta sẽ đăng ký AdminModule làm module cha của DashboardModule và MetricsModule.

@Module({
  imports: [
    AdminModule,
    DashboardModule,
    MetricsModule,
    RouterModule.register([
      {
        path: 'admin',
        module: AdminModule,
        children: [
          {
            path: 'dashboard',
            module: DashboardModule,
          },
          {
            path: 'metrics',
            module: MetricsModule,
          },
        ],
      },
    ])
  ],
});

Gợi ý Tính năng này cần được sử dụng hết sức cẩn thận, vì lạm dụng nó có thể khiến code khó bảo trì về sau.

Trong ví dụ trên, bất kỳ controller nào đăng ký bên trong DashboardModule sẽ có thêm prefix /admin/dashboard (vì module nối các path từ trên xuống dưới - một cách đệ quy - từ cha đến con). Tương tự, mỗi controller định nghĩa bên trong MetricsModule sẽ có thêm prefix cấp module /admin/metrics.

Ghi chú người dịch Cơ chế này giống với việc dùng Router.route() lồng nhau trong Express hoặc router.group(['prefix' => ...]) trong Laravel — thay vì khai báo prefix rải rác ở nhiều nơi, bạn gom logic route vào một chỗ duy nhất. Điểm khác biệt là ở Nest, RouterModule không thay đổi cách bạn viết controller, nó chỉ là một lớp cấu hình nằm ngoài, giúp module giữ tính độc lập (không cần biết trước nó sẽ bị mount ở prefix nào).

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.