我可以创建一个同时监听HTTP和HTTPS的Express服务器,使用相同的路由和相同的中间件吗?

目前,我使用HTTP上的Express来实现这一点,使用stunnel个 tunel HTTPS来实现,但我更喜欢纯 node 解决方案.

我可以用这段代码实现,但使用标记为private的handle方法:

var express = require( 'express' )
    , https = require("https")
    , fs = require( 'fs' );

var app = express.createServer();
// init routes and middlewares
app.listen( 80 );

var privateKey = fs.readFileSync( 'privatekey.pem' ).toString();
var certificate = fs.readFileSync( 'certificate.pem' ).toString();
var options = {key: privateKey, cert: certificate};
https.createServer( options, function(req,res)
{
    app.handle( req, res );
} ).listen( 443 );

推荐答案

您可以通过以下方式共享实现:

var register = function (app) {
    // config middleware
    app.configure({

    });

    // config routes
    app.get(...);
};

var http = express.createServer();
register(http);
http.listen(80);

var https = express.createServer({ key: /* https properties */ });
register(https);
https.listen(443);

Node.js相关问答推荐

为什么请求正文未定义?

如何在CustomGPT的 node 中使用服务器端事件(SSE)

try 使用Puppeteer抓取Twitter时数组空

Spotify Auth访问令牌给出错误代码400

如何从shell脚本中计算ecmascript模块?

JsonwebToken过期后如何注销和清除cookie?

Inno Setup如何在现有文本文件中追加新内容

FHIR 服务器:尽管 JSON 格式正确,但在 POST 请求中接收未定义请求正文

如何在 require 方法中使用路径与node.js react ?

为什么 nginx 不将我的 react index.html 作为后备服务

TypeError:在使用 Jest、Supertest、Express、Typescript 进行测试时无法读取未定义的属性(读取listen)

处理 UTC 日期和future

使用 Forms API 进行批量更新时生成 itemId

node和mongoDB聚合数据时的输入字段函数

在多个 .env 文件之间切换,例如 .env.development 和 node.js

Node.js + Express:应用程序不会开始监听端口 80

webpack css-loader 在外部样式表的 url() 引用中找不到图像

为什么我们要为 Angular 2.0 安装 Node.js?

从 zip 文件在 AWS 中创建 lambda 函数

未在 Windows 8.1 上构建的 node 包 - 缺少 Microsoft.Cpp.Default.props