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 适配器实例。它会是 ExpressAdapter 或 FastifyAdapter 的实例(这两个类都继承自 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');
}