使用@ nestjs / platform-fastify运行NestJS时,多个同时运行的服务器的正确实现是什么?

时间:2019-11-19 19:31:02

标签: nestjs fastify

我试图在运行@ nestjs / platform-fastify集成的NestJS应用程序上同时运行两台服务器(特别是我试图运行同一应用程序的一台HTTP和一台HTTPS服务器)。

NestJS文档包括用于快速集成的多个服务器,但未提及如何使用fastify(https://docs.nestjs.com/faq/multiple-servers)来实现此目的。有人知道正确的实现方式能够做到这一点吗?

1 个答案:

答案 0 :(得分:0)

编辑11/20/19

所以看来我的原始答案不正确。大多数情况下,我只是退出文档并尝试将某些东西拼凑在一起,而忘记了Fastify的服务器实例与Express的服务器实例不同,因此与内置的http(s)模块不兼容。如果您不介意再次让NestJS设置依赖项,则始终可以执行以下操作:

import { NestFactory } from '@nestjs/core';
import { FastifyAdapter } from '@nestjs/platform-fastify';
import { AppModule } from './app.module';
import { readFileSync } from 'fs';
import { join } from 'path';
import fastify = require('fastify');

const httpsOptions = {
  key: readFileSync(join(__dirname, '..', 'secrets', 'ssl.key')),
  cert: readFileSync(join(__dirname, '..', 'secrets', 'ssl.crt')),
};

async function bootstrap() {
  const fastifyHttps = fastify({https: httpsOptions});
  const httpApp = await NestFactory.create(AppModule , new FastifyAdapter() );
  const httpsApp = await NestFactory.create(AppModule, new FastifyAdapter(fastifyHttps));
  await httpApp.listen(3000);
  console.log('http running on port 3000');
  await httpsApp.listen(3333);
  console.log('https running on port 3333');
}
bootstrap();

这次,我对其进行了测试,以确保它可以正常工作。


仅适用于Express

Nest提供了使用app.getHttpServer()创建应用程序后将服务器实例取回的方法,因此无论如何您都可以验证server。因此,您可以像通常使用fastify适配器一样来设置应用程序,然后在运行await app.init()之后即可获取服务器实例。在这里,您可以创建服务器并使用内置的httphttps设置侦听端口,例如docs用express显示的包。

const httpsOptions = {
  key: fs.readFileSync('./secrets/private-key.pem'),
  cert: fs.readFileSync('./secrets/public-certificate.pem'),
};

const app = await NestFactory.create(
  ApplicationModule
);
await app.init();

const server = app.getHttpServer();

http.createServer(server).listen(3000);
https.createServer(httpsOptions, server).listen(443);

那应该可以解决问题