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

HTTP adapter

Bản dịch từ docs.nestjs.com/faq/http-adapter

Đôi khi bạn cần truy cập trực tiếp HTTP server bên dưới, từ bên trong application context của Nest hoặc từ bên ngoài.

Mỗi instance HTTP server/thư viện gốc theo nền tảng (native, platform-specific) (ví dụ: Express và Fastify) đều được bọc trong một adapter. Adapter này được đăng ký như một provider toàn cục (global-scoped), có thể lấy ra từ application context, cũng như inject vào các provider khác.

Chiến lược truy cập từ bên ngoài application context

Để lấy reference đến HttpAdapter từ bên ngoài application context, gọi phương thức getHttpAdapter().

const app = await NestFactory.create(AppModule);
const httpAdapter = app.getHttpAdapter();

Dùng như injectable

Để lấy reference đến HttpAdapterHost từ bên trong application context, inject nó theo cách tương tự như bất kỳ provider nào khác (ví dụ: dùng constructor injection).

export class CatsService {
  constructor(private adapterHost: HttpAdapterHost) {}
}
@Dependencies(HttpAdapterHost)
export class CatsService {
  constructor(adapterHost) {
    this.adapterHost = adapterHost;
  }
}

Gợi ý HttpAdapterHost được import từ package @nestjs/core.

Ghi chú người dịch Lý do có HttpAdapterHost bọc ngoài HttpAdapter thay vì inject thẳng adapter: tại thời điểm các provider khác được khởi tạo (constructor chạy), adapter thật sự có thể chưa sẵn sàng — HttpAdapterHost đóng vai trò một “hộp chứa” (holder) được cập nhật httpAdapter sau, giúp tránh lỗi circular/undefined khi bạn cần adapter ngay trong constructor.

HttpAdapterHost không phải là HttpAdapter thật sự. Để lấy instance HttpAdapter thật sự, chỉ cần truy cập thuộc tính httpAdapter.

const adapterHost = app.get(HttpAdapterHost);
const httpAdapter = adapterHost.httpAdapter;

httpAdapter là instance thật sự của HTTP adapter được framework bên dưới sử dụng. Nó là một instance của ExpressAdapter hoặc FastifyAdapter (cả hai class đều kế thừa AbstractHttpAdapter).

Đối tượng adapter cung cấp một số phương thức hữu ích để tương tác với HTTP server. Tuy nhiên, nếu bạn muốn truy cập trực tiếp instance của thư viện (ví dụ: instance Express), gọi phương thức getInstance().

const instance = httpAdapter.getInstance();

Sự kiện listening

Để thực thi một hành động khi server bắt đầu lắng nghe request đến, bạn có thể subscribe vào stream listen$, như minh họa dưới đây:

this.httpAdapterHost.listen$.subscribe(() =>
  console.log('HTTP server is listening'),
);

Ngoài ra, HttpAdapterHost còn cung cấp thuộc tính boolean listening cho biết server hiện có đang hoạt động và lắng nghe hay không:

if (this.httpAdapterHost.listening) {
  console.log('HTTP server is listening');
}

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.