Đô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');
}