☰ 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ữ
Nền tảng (Fundamentals)

Asynchronous providers (Provider bất đồng bộ)

Bản dịch từ docs.nestjs.com/fundamentals/async-providers

Đôi khi, việc khởi động ứng dụng cần được trì hoãn cho đến khi một hoặc nhiều tác vụ bất đồng bộ hoàn tất. Ví dụ, bạn có thể không muốn bắt đầu nhận request cho tới khi kết nối tới database đã được thiết lập. Bạn có thể làm điều này bằng cách sử dụng provider bất đồng bộ (asynchronous provider).

Cú pháp cho việc này là dùng async/await kết hợp với cú pháp useFactory. Factory trả về một Promise, và hàm factory có thể await các tác vụ bất đồng bộ. Nest sẽ chờ promise resolve xong trước khi khởi tạo bất kỳ class nào phụ thuộc vào (inject) provider đó.

{
  provide: 'ASYNC_CONNECTION',
  useFactory: async () => {
    const connection = await createConnection(options);
    return connection;
  },
}

Gợi ý Tìm hiểu thêm về cú pháp custom provider tại đây.

Ghi chú người dịch Cơ chế này giống với việc một Go service chờ sql.Open + ping thành công trước khi http.ListenAndServe, hoặc một Express app chờ mongoose.connect() resolve trước khi gọi app.listen(). Điểm khác là ở Nest, việc “chờ” này nằm ngay trong quá trình xây dựng dependency graph của IoC container — Nest tự biết class nào cần đợi provider này xong mới được khởi tạo, bạn không phải tự viết code chờ thủ công.

Injection (Inject)

Provider bất đồng bộ được inject vào các component khác thông qua token của nó, giống như bất kỳ provider nào khác. Trong ví dụ trên, bạn sẽ dùng cú pháp @Inject('ASYNC_CONNECTION').

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.