FAQ

HTTP 适配器

有时,您可能希望在 Nest 应用程序上下文中或从外部访问底层 HTTP 服务器。

基本上,每个本机(特定于平台的)HTTP 服务器/库实例都包含在 adapter(适配器)中。适配器注册为全局可用的提供程序,可以从应用程序上下文中提取,也可以轻松地注入其他提供程序。

外部策略

为了 HttpAdapter 从应用程序上下文中获取,您可以调用 getHttpAdapter() 方法。

  1. const app = await NestFactory.create(ApplicationModule);
  2. const httpAdapter = app.getHttpAdapter();

上下文策略

为了 HttpAdapterHost 从应用程序上下文中获取,您可以采用与任何其他现有提供程序相同的方式注入它(例如,通过 constructor)。

  1. export class CatsService {
  2. constructor(private readonly adapterHost: HttpAdapterHost) {}
  3. }

HttpAdapterHost 需要从 @nestjs/core 导入包。

适配器主机

到目前为止,我们已经学会了如何获得 HttpAdapterHost 。但是,它仍然不是真实的 HttpAdapter 。为了获得 HttpAdapter ,只需访问该 httpAdapter 属性。

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

httpAdapter 是底层框架使用的 HTTP 适配器的实际实例。它可以是 ExpressAdapterFastifyAdapter(两个类都扩展了 AbstractHttpAdapter)。

每个适配器都公开了几种与 HTTP 服务器交互的有用方法。尽管如此,如果您想直接访问库引用,请调用 getInstance() 方法。

  1. const instance = httpAdapter.getInstance();

全局路由前缀

要为应用程序中的每个路由设置前缀, 让我们使用 INestApplication 对象的 setGlobalPrefix() 方法。

  1. const app = await NestFactory.create(ApplicationModule);
  2. app.setGlobalPrefix('v1');

混合应用

混合应用程序是一个应用程序,它监听 HTTP 请求,可以通过实例 connectMicroservice() 函数将 INestApplicationINestMicroservice 实例的无限计数结合起来。

  1. const app = await NestFactory.create(ApplicationModule);
  2. const microservice = app.connectMicroservice({
  3. transport: Transport.TCP,
  4. });
  5. await app.startAllMicroservicesAsync();
  6. await app.listen(3001);

HTTPS 和多服务器

HTTPS

为了创建使用 HTTPS 协议的应用程序,我们必须传递一个 options 对象:

  1. const httpsOptions = {
  2. key: fs.readFileSync('./secrets/private-key.pem'),
  3. cert: fs.readFileSync('./secrets/public-certificate.pem'),
  4. };
  5. const app = await NestFactory.create(ApplicationModule, {
  6. httpsOptions,
  7. });
  8. await app.listen(3000);

如果使用Fastify,则创建 app 如下代码:

  1. const app = await NestFactory.create<NestFastifyApplication>(
  2. ApplicationModule,
  3. new FastifyAdapter({ https: httpsOptions }),
  4. );

多个同步服务器

对库实例的完全控制提供了一种简单的方法来创建同时监听多个不同端口的服务器。

  1. const httpsOptions = {
  2. key: fs.readFileSync('./secrets/private-key.pem'),
  3. cert: fs.readFileSync('./secrets/public-certificate.pem'),
  4. };
  5. const server = express();
  6. const app = await NestFactory.create(
  7. ApplicationModule,
  8. new ExpressAdapter(server),
  9. );
  10. await app.init();
  11. http.createServer(server).listen(3000);
  12. https.createServer(httpsOptions, server).listen(443);

ExpressAdapter 需要从 @nestjs/platform-express 包导入。

实例

更多例子参考

译者署名

用户名 头像 职能 签名
@zuohuadong FAQ - 图1 翻译 专注于 caddy 和 nest,@zuohuadong at Github
@Drixn FAQ - 图2 翻译 专注于 nginx 和 C++,@Drixn @Drixn FAQ - 图3 翻译 专注于 nginx 和 C++,@Drixn
@Armor FAQ - 图4 翻译 专注于 Java 和 Nest,@Armor