在Node.js中创建对象以附加到HTTP和HTTPS Express服务器

3

好的,我有一个使用node.js编写的应用程序,其中有两个express服务器。一个监听80端口(HTTP),另一个监听443端口(HTTPS)。

现在,它们并不具有完全相同的路由。相反,大多数内容都是通过HTTPS提供的,一些内容是通过HTTP提供的。但是,有一些重叠。

因此,我想知道是否有一种方法可以“绑定”路由到我称之为secureApp和App的两个服务器上,以便我不必写两次路由?

例如,现在我有两组相同的路由(一组用于HTTP,另一组用于HTTPS):

app.get('/tweet-stats.json', function(req, res){
    res.set('Content-Type', 'application/json');
    res.send(publicTweetStatus());
});

secureApp.get('/tweet-stats.json', function(req, res){
    res.set('Content-Type', 'application/json');
    res.send(publicTweetStatus());
});

我想做类似这样的事情:
model.get('/tweet-stats.json', function(req, res){
    res.set('Content-Type', 'application/json');
    res.send(publicTweetStatus());
});

app.handle.bind(model);
secureApp.handle.bind(model);

这是可能的吗?如果我只管理一个特定路由的一个实例,那么编码将更加优秀。

我真的很好奇,为什么你不会用HTTPS来提供所有内容? - JP Richardson
性能。只有某些事情才是真正的私人数据。这需要使用HTTPS,其他所有内容都是公开的,我将通过HTTP或HTTPS(用户自选)进行服务。一些用户始终喜欢使用HTTPS,并使用浏览器插件,如[HTTP Everywhere](https://www.eff.org/https-everywhere)。我永远不会降级HTTPS请求,但对于任何私密事项,我将要求额外的安全性。 - Justin Elkow
1个回答

7
为什么要重复自己?只需阻止无法使用的路由。
function secureOnly(req, res, next) {
  if (!req.secure) {
    res.send(426, 'sorry')
  else {
    next()
  }
}

并且在两个端口上进行监听

http.createServer(app).listen(80)
https.createServer(app).listen(443)

3
在仅安全路由中,可以这样指定:app.get('/route', secureOnly, function(req, res) { ... }); - josh3736
非常有趣的想法。但是,我不应该使用301重定向吗?在这里查看 - Justin Elkow
由你决定。重点是,不需要重复自己! - Jonathan Ong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接