我确信这只是一个简单的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;
请记住,只要你不需要同时处理一百万个请求,同步处理是可以的。