NestJS同时配置HTTP与HTTPS服务器报错,求解决方案
在NestJS 6.x中同时配置HTTP和HTTPS服务器的类型错误解决办法
我之前也碰到过NestJS 6.x版本里这个适配器类型不兼容的问题,咱们一步步来解决它:
首先明确问题根源:你使用的NestJS 6.x版本中,ExpressAdapter的instance属性是受保护的,手动创建express实例并直接传给适配器的方式,会触发类型校验失败的错误。下面是两种可行的解决办法,优先推荐第一种:
方法一:让ExpressAdapter内部管理Express实例(推荐)
这种方式完全符合NestJS 6.x的适配器设计规范,能从根源避免类型冲突:
import * as fs from 'fs'; import * as http from 'http'; import * as https from 'https'; import { NestFactory } from '@nestjs/core'; import { ExpressAdapter } from '@nestjs/platform-express'; import { AppModule } from './app.module'; async function bootstrap() { // 配置HTTPS证书选项 const httpsOptions = { key: fs.readFileSync('D:\\localhost.ssh\\ajanuw.local.key'), cert: fs.readFileSync('D:\\localhost.ssh\\ajanuw.local.crt'), }; // 创建Express适配器,由它内部初始化Express实例 const expressAdapter = new ExpressAdapter(); // 将适配器传入NestFactory.create创建应用 const app = await NestFactory.create(AppModule, expressAdapter); app.enableCors(); await app.init(); // 通过适配器的公共方法安全获取内部的Express实例 const server = expressAdapter.getInstance(); // 分别启动HTTP和HTTPS服务器 http.createServer(server).listen(3000, () => { console.log('HTTP服务器运行在端口3000'); }); https.createServer(httpsOptions, server).listen(443, () => { console.log('HTTPS服务器运行在端口443'); }); } bootstrap();
关键调整说明:
- 不再手动创建
express()实例,而是让ExpressAdapter自行初始化管理 - 通过
expressAdapter.getInstance()方法获取内部的Express实例,避开了受保护属性的访问限制 - 完整保留了你原有同时启动HTTP和HTTPS服务器的业务逻辑
方法二:类型断言(不推荐,仅作参考)
如果你坚持要手动管理Express实例,可以通过类型断言临时绕过类型校验,但这种方式可能隐藏潜在的版本兼容问题:
import * as fs from 'fs'; import * as http from 'http'; import * as https from 'https'; import * as express from 'express'; import { NestFactory } from '@nestjs/core'; import { ExpressAdapter } from '@nestjs/platform-express'; import { AbstractHttpAdapter } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const httpsOptions = { key: fs.readFileSync('D:\\localhost.ssh\\ajanuw.local.key'), cert: fs.readFileSync('D:\\localhost.ssh\\ajanuw.local.crt'), }; const server = express(); const app = await NestFactory.create( AppModule, new ExpressAdapter(server) as unknown as AbstractHttpAdapter, ); app.enableCors(); await app.init(); http.createServer(server).listen(3000); https.createServer(httpsOptions, server).listen(443); } bootstrap();
额外注意事项:
- 你配置的Windows证书路径写法是正确的,双反斜杠能被Node.js正确解析
- 鉴于你使用的是Node.js v10.x,虽然能兼容NestJS 6.x,但后续建议升级到更稳定的Node.js版本(比如14.x或16.x),以获得更好的兼容性和安全性
内容的提问来源于stack exchange,提问作者januw a
相关产品推荐
相关产品推荐

