在单个快递应用上收听HTTP和HTTPS

Jaz*_*azz 52 javascript https node.js express

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

目前,我这样做是与快递于HTTP,用安全通道隧道HTTPS来表达,但我更喜欢一个纯粹的节点解决方案.

我可以使用此代码执行此操作,但使用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 );
Run Code Online (Sandbox Code Playgroud)

Sna*_*hot 36

作为此问题的可能更新,您可能需要查看此处针对快递3的更改.更改文档说:

返回值express()是一个JavaScript函数,封装了使Express应用程序打勾的所有内容.这意味着您可以通过将应用程序的HTTP和HTTPS版本传递给节点来轻松设置它们,http.createServer()并且https.createServer():

在Express 3中,express.createServer()现在是express()

以下是快递3的完整示例:

var fs = require('fs')
    , https = require('https')
    , http = require('http')
    , express = require('express')
    , keys_dir = 'keys/'
    , server_options = {
        key  : fs.readFileSync(keys_dir + 'privatekey.pem'),
        ca   : fs.readFileSync(keys_dir + 'certauthority.pem'),
        cert : fs.readFileSync(keys_dir + 'certificate.pem')
      }
    , app = express();
app.configure(function(){
  app.use(express.cookieParser());
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.session( { secret: '' } ));
  app.use(app.router);
});
app.configure('development',function(){
  app.use(express.static(__dirname + '/public'));
  app.use(express.errorHandler({dumpExceptions: true, showStack:true}));
  app.set('view options', { pretty: true });
});
app.get('/', function(req, res){
  res.send('Hello World!');
});
https.createServer(server_options,app).listen(7000);
http.createServer(app).listen(8000);
Run Code Online (Sandbox Code Playgroud)

  • 最好使用提问者使用的相同语言回答问题.我冒昧地将咖啡因翻译成香草JS. (20认同)

cmd*_*cmd 33

为了使您的应用程序监听双方httphttps有关港口80443分别执行以下操作

创建快速应用:

var express = require('express');
var app = express();
Run Code Online (Sandbox Code Playgroud)

返回的应用程序express()是一个JavaScript函数.它可以作为回调来传递给Node的HTTP服务器来处理请求.这样可以使用相同的代码库轻松提供应用程序的HTTP和HTTPS版本.

你可以这样做:

var express = require('express');
var https = require('https');
var http = require('http');
var fs = require('fs');
var app = express();

var options = {
  key: fs.readFileSync('/path/to/key.pem'),
  cert: fs.readFileSync('/path/to/cert.pem')
};

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
Run Code Online (Sandbox Code Playgroud)

有关完整详细信息,请参阅文档


Jan*_*oom 26

您可以通过以下方式分享实施:

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);
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案现已弃用.有更新的解决方案吗? (11认同)