当 运行 NestJS 与 @nestjs/platform-fastify 时,多个同时服务器的正确实现是什么?
What is the correct implementation for multiple simultaneous servers when running NestJS with @nestjs/platform-fastify?
我正在尝试 运行 NestJS 应用程序上的两个同步服务器 运行 @nestjs/platform-fastify 集成(具体来说,我正在尝试 运行 一个 HTTP 和一个 HTTPS同一个应用程序的服务器)。
NestJS 文档包括用于快速集成的多服务器,但没有提及如何使用 fastify (https://docs.nestjs.com/faq/multiple-servers) 执行此操作。有谁知道能够做到这一点的正确实施方式吗?
编辑 2019 年 11 月 20 日
看来我原来的回答是不正确的。我大部分时间只是离开文档并试图拼凑一些东西,忘记了 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()
之后您可以获得服务器实例。从那里你可以创建服务器并使用 http
和 https
内置包设置监听端口,就像文档用 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);
这应该可以解决问题
我正在尝试 运行 NestJS 应用程序上的两个同步服务器 运行 @nestjs/platform-fastify 集成(具体来说,我正在尝试 运行 一个 HTTP 和一个 HTTPS同一个应用程序的服务器)。
NestJS 文档包括用于快速集成的多服务器,但没有提及如何使用 fastify (https://docs.nestjs.com/faq/multiple-servers) 执行此操作。有谁知道能够做到这一点的正确实施方式吗?
编辑 2019 年 11 月 20 日
看来我原来的回答是不正确的。我大部分时间只是离开文档并试图拼凑一些东西,忘记了 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()
之后您可以获得服务器实例。从那里你可以创建服务器并使用 http
和 https
内置包设置监听端口,就像文档用 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);
这应该可以解决问题