• NestJS Logo
    NestJS 中文文档
    v10.0.0
    • 介绍
    • 快速上手
    • 控制器
    • 提供者
    • 模块
    • 中间件
    • 异常过滤器
    • 管道
    • 守卫
    • 拦截器
    • 自定义装饰器
    • 自定义提供者
    • 异步提供者
    • 动态模块
    • 依赖注入作用域
    • 循环依赖
    • 模块引用
    • 懒加载模块
    • 执行上下文
    • 生命周期事件
    • 发现服务
    • 跨平台无关性
    • 测试
  • 迁移指南
  • API 参考
  • 官方课程
  1. 文档
  2. 常见问题
  3. HTTP 适配器

英文原版
Serverless
HTTP 长连接

HTTP 适配器

在开发 Nest 应用时,有时你可能需要直接访问底层的原生 HTTP 服务器实例,例如 Express 或 Fastify。这种需求可能出现在应用上下文(ApplicationContext)内部,也可能出现在其外部。

Nest 对每种特定平台的 HTTP 服务器都封装了一个对应的适配器,用于屏蔽平台差异,统一接口。这些适配器会作为全局提供者注册到依赖注入容器中,因此你可以在应用内部直接注入使用,或者通过应用上下文进行访问。

获取 HttpAdapter 实例

在 Nest 应用中,有时你可能需要直接访问底层的 HTTP 适配器(如 Express 或 Fastify 的实例)。Nest 提供了两种方式来获取 HttpAdapter 对象,分别适用于应用上下文外部和内部的使用场景。

在应用上下文外部获取

如果你在应用初始化逻辑中需要获取 HTTP 适配器实例,可以通过调用 getHttpAdapter() 方法实现:

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

此时返回的 httpAdapter 即为底层框架的适配器对象,其类型可能是 ExpressAdapter 或 FastifyAdapter,两者都继承自 AbstractHttpAdapter。

在应用上下文内部获取

在服务类、守卫或其他依赖注入环境中,推荐通过注入 HttpAdapterHost 来间接访问 HTTP 适配器:

cats.service.ts
import { HttpAdapterHost } from '@nestjs/core'

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

需要注意的是,HttpAdapterHost 并不是实际的适配器对象,而是一个持有者(host)。你需要通过其 .httpAdapter 属性来获取真正的适配器实例:

const httpAdapter = this.adapterHost.httpAdapter

使用适配器实例

适配器对象封装了多个与底层 HTTP 服务相关的实用方法。例如,若你希望直接访问底层框架的原始实例(如 Express 应用对象),可以调用 getInstance() 方法:

const instance = httpAdapter.getInstance()

监听 HTTP 服务启动事件

在某些场景下,你可能希望在 HTTP 服务器成功启动并开始监听请求之后执行一些操作。Nest 提供了两种方式来实现这一需求。

方式一:订阅 listen$ 事件流

HttpAdapterHost 提供了一个名为 listen$ 的 Observable,你可以通过订阅它,在服务器开始监听时执行自定义逻辑:

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

这通常用于异步监听、日志记录或启动后的初始化操作等。

方式二:读取 listening 状态属性

如果你只是想在某处判断服务器是否已开始监听请求,可以使用 HttpAdapterHost 提供的 listening 布尔属性:

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

这种方式适用于在逻辑分支中做出判断,而非监听事件的响应式场景。