2011-12-02 63 views
34

我可以使用相同的路由和相同的中间件创建侦听HTTP和HTTPS的Express服务器吗?针对单个快递应用程序监听HTTP和HTTPS

目前我在HTTP上使用Express执行此操作,使用stunnel将HTTPS转换为Express,但我更喜欢纯节点解决方案。

我可以用这个代码做到这一点,但使用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); 
+0

回答简洁这里:http://stackoverflow.com/a/23894573/1882064 – arcseldon

回答

17

您可以通过喜欢的东西分享的实现:

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); 
+0

很好的方式来做到这一点! – Jazz

+10

现在不推荐使用此解决方案。有没有更新的解决方案? –

+0

@CMN - 请参阅下面的cmd解决方案。它适用于当前版本的Node(v4.4.2)和Express(4.13.4) – paulsm4

0

类似的帖子

Can I configure expressjs to serve some pages over http and others over https?

要知道,现在表示支持建立HTTPS伺服器附:

var app = require('express').createServer({ key: ... }); 
+0

我知道如何创建HTTPS服务器,但不是响应HTTP和HTTPS的服务器。 – Jazz

+0

您是否阅读过其他文章?这篇文章中有一个例子。您创建2个服务器实例,并在端口80上进行侦听,并在443,Http和Https上进行侦听。 –

+1

是的,我读了另一篇文章:有2个不同路由的服务器实例。我需要两个相同的路由(或者只有一个实例监听HTTP和HTTPS)。 – Jazz

30

作为一个可能的更新这个问题,你可能想看看快递3.更改here改变文件说:

的返回值express()是一个JavaScript函数, 封装了一切使快捷应用程序打勾的内容。这意味着 您可以通过 您的应用程序轻松地设置HTTP和HTTPS版本,它传递给节点的http.createServer()https.createServer()

快递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); 
+15

最好使用提问者使用的相同语言回答问题。我冒昧将咖啡标签翻译成香草JS。 – gcochard

+0

在这里简洁地回答:http://stackoverflow.com/a/23894573/1882064 – arcseldon

17

为了使您的应用程序侦听端口都http和和443分别,请执行下列操作

创建一个明确的应用程序:

var express = require('express'); 
var app = express(); 

通过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); 

有关完整的细节见doc