Variable HTTP/HTTPS Express Server

Variable HTTP/HTTPS Express Server

本文关键字:Express Server HTTPS HTTP Variable      更新时间:2023-09-26

我确信这只是一个简单的Javascript作用域问题(去图),但我已经尝试了几种不同的方法,似乎不能得到这个工作。

这个想法是Express.js服务器在调用express.createServer()时默认使用HTTP,但在检测到./conf/cert时可选择切换到HTTPS。Pem ./conf/key.pem。我使用异步调用Node的path.exists(),其中第二个回调参数包含布尔值结果。

我目前有它们嵌套,这样HTTPS服务器不会创建,直到它是"安全的"(我们知道两个文件是否存在的结果),因为没有排序保证否则。然而,正如我提到的,我已经尝试了几种不同的方法,但我似乎无法修改外部app变量。

我肯定有一个简单的修复,我现在没有看到,但任何帮助将是感激的!

app = module.exports = express.createServer();
path.exists('./conf/key.pem', function(exists){
    var keyExists = exists;
    path.exists('./conf/cert.pem', function(exists) {
        var certExists = exists;
        if (keyExists && certExists) {
             app = express.createServer({
                key: fs.readFileSync('./conf/key.pem'),
                cert: fs.readFileSync('./conf/cert.pem')
              });
         }
    });
});

这并不理想。您不应该创建一个普通的http服务器,只是为了让它被https服务器覆盖。我认为你提到的问题来自于你在下面设置了app变量,而不是module.exports。所以module.exports仍然是指创建的原服务器。你应该这样做:

var app = express.createServer({
  key: fs.readFileSync('./conf/key.pem'),
  cert: fs.readFileSync('./conf/cert.pem')
});
module.exports = app;

没有理由先检查文件是否存在。如果文件不存在,readFileSync将抛出一个enent。在进入事件循环之前,也没有理由异步执行任何操作。

我不知道为什么你想让你的服务器有条件地使用https,但是要做一些类似于你在那里尝试做的事情:

var app;
try {
  app = express.createServer({
    key: fs.readFileSync('./conf/key.pem'),
    cert: fs.readFileSync('./conf/cert.pem')
  });
} catch(e) {
  if (e.code !== 'ENOENT') throw e;
  app = express.createServer();
}
module.exports = app;

或者,这样看起来更好:

var app;
if (path.existsSync('./conf/key.pem')) {
  app = express.createServer({
    key: fs.readFileSync('./conf/key.pem'),
    cert: fs.readFileSync('./conf/cert.pem')
  });
} else {
  app = express.createServer();
}
module.exports = app;

请记住,只要你不需要同时处理一百万个请求,同步处理是可以的。