You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:21:15