gpt4 book ai didi

javascript - 可变 HTTP/HTTPS Express 服务器

转载 作者:行者123 更新时间:2023-11-28 21:18:31 24 4
gpt4 key购买 nike

我确信这只是一个简单的 Javascript 范围问题(见图),但我尝试了几种不同的方法,但似乎无法让它发挥作用。

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

我目前将它们嵌套起来,以便在“安全”之前不会创建 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 将抛出 ENOENT。在进入事件循环之前也没有理由异步执行任何操作。

我不知道为什么你希望你的服务器有条件地成为 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;

请记住,只要您不必同时处理一百万个请求,同步执行操作就可以。

关于javascript - 可变 HTTP/HTTPS Express 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6976880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com