Skip to content

HTTP 适配器

有时你可能需要访问底层的 HTTP 服务器,无论是在 Nest 应用上下文内部,还是在应用外部。

每个原生(平台特定)的 HTTP 服务器 / 库实例(例如 Express 和 Fastify)都会被包装在一个适配器里。这个适配器会注册为一个全局可用的 provider,你既可以从应用上下文中获取它,也可以将其注入到其他 provider 中。

应用上下文外获取

如果你希望在应用上下文外部拿到 HttpAdapter 的引用,可以调用 getHttpAdapter() 方法:

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

通过注入获取

如果你希望在应用上下文内部拿到 HttpAdapterHost 的引用,可以像注入其他已有 provider 一样,通过构造函数注入它:

typescript
export class CatsService {
  constructor(private adapterHost: HttpAdapterHost) {}
}

提示

HttpAdapterHost@nestjs/core 包中导入。

需要注意的是,HttpAdapterHost 本身并不是真正的 HttpAdapter。要拿到底层实际的 HttpAdapter 实例,只需要访问它的 httpAdapter 属性即可:

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

httpAdapter 就是底层框架实际使用的 HTTP 适配器实例。它会是 ExpressAdapterFastifyAdapter 的实例(这两个类都继承自 AbstractHttpAdapter)。

适配器对象暴露了一些有用的方法,方便你与 HTTP 服务器交互。如果你想直接访问底层库实例(例如 Express 实例本身),可以调用 getInstance() 方法:

typescript
const instance = httpAdapter.getInstance();

监听事件

如果你希望在服务器开始监听请求时执行某个动作,可以订阅 listen$ 流,例如:

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

此外,HttpAdapterHost 还提供了一个 listening 布尔属性,用于表示当前服务器是否已经处于监听状态:

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

基于 NestJS 官方文档翻译