为 HTTPS 设置超时的正确方法
Correct way to set timeout for HTTPS
我有一个工作正常的上传系统,但是自从我在我的快速服务器上实施了 SSL 之后,任何超过 2 分钟的上传都会失败,我得到 net::ERR_FAILED
和以前一样大小文件可能需要多长时间,它最终会到达那里,但现在刚好 2 分钟,它就会停止。
我查看了一堆 post 讨论节点中 HTTPS 超时的内容。
我已经尝试了很多不同的超时设置变体,但似乎没有任何效果。
我尝试过的例子:
在我的 post 路线中:
app.post(
'/uploadResources/', extendTimeout, uploadResources.array('file', 1), (req, res, next) => {
console.log("File must be done if you can read this...")
req.socket.setTimeout(500000);
res.json({
file: req.file,
});
req.end();
});
function extendTimeout (req, res, next) {
console.log("Started!");
// adjust the value for the timeout, here it's set to 3 minutes
res.setTimeout(500000, () => { console.log("timed out") })
next();
}
具有以下变化:
res.connection.setTimeout(0);
// 无限
res.connection.setTimeout(500000);
在我定义我的服务器的地方我已经尝试了所有这些:
server.setTimeout(500000);
server.timeout = 500000;
server.on('connection', function(socket) {
socket.setTimeout(500000);
socket.setKeepAlive(true);
});
None 项有所作为!无论如何,在我添加我的 SSL 证书并且只使用 HTTP 之前,我这样定义了我的服务器:
var app = express();
// Listen on port 3000 for any calls
var server = app.listen(3000, function () {
console.log('VCS-API REST server started - yay.');
});
server.on('connection', function(socket) {
// 10 minutes timeout
socket.setTimeout(500000);
socket.setKeepAlive(true);
});
这工作正常...但是,我添加了我的 SSL 证书,现在我像这样定义服务器(这适用于在不到 2 分钟内完成的较小文件):
const httpsOptions = {cert, ca, key};
const httpsServer = https.createServer(httpsOptions, app);
// Listen on port 443 for any calls
var server = httpsServer.listen(443, function () {
console.log('VCS-API REST server started - yay.');
});
server.on('connection', function(socket) {
// 10 minutes timeout
socket.setTimeout(500000);
socket.setKeepAlive(true);
});
所以我的确切问题是:在 HTTPS 中设置超时以启用更长的文件上传的正确方法是什么?
所以我用 op 调试了一些有趣的东西,结果发现使用包“multer-s3”建立了第二个连接。
这是有问题的连接,而不是从浏览器->节点上传文件。
为了暴露问题,添加了 client error 的事件侦听器:
server.on('clientError', (err, socket) => {
console.log(err)
});
这显示超时错误
ERR_HTTP_REQUEST_TIMEOUT
未处理的错误导致整个连接关闭。只需处理事件中的错误就足以让请求按预期完成。
如果不深入研究 multer-s3 包装,当底层服务器是 https 时,看起来会出现某种超时问题。对此的修复是捕获错误,记录它并允许请求继续。
我有一个工作正常的上传系统,但是自从我在我的快速服务器上实施了 SSL 之后,任何超过 2 分钟的上传都会失败,我得到 net::ERR_FAILED
和以前一样大小文件可能需要多长时间,它最终会到达那里,但现在刚好 2 分钟,它就会停止。
我查看了一堆 post 讨论节点中 HTTPS 超时的内容。
我已经尝试了很多不同的超时设置变体,但似乎没有任何效果。
我尝试过的例子:
在我的 post 路线中:
app.post(
'/uploadResources/', extendTimeout, uploadResources.array('file', 1), (req, res, next) => {
console.log("File must be done if you can read this...")
req.socket.setTimeout(500000);
res.json({
file: req.file,
});
req.end();
});
function extendTimeout (req, res, next) {
console.log("Started!");
// adjust the value for the timeout, here it's set to 3 minutes
res.setTimeout(500000, () => { console.log("timed out") })
next();
}
具有以下变化:
res.connection.setTimeout(0);
// 无限
res.connection.setTimeout(500000);
在我定义我的服务器的地方我已经尝试了所有这些:
server.setTimeout(500000);
server.timeout = 500000;
server.on('connection', function(socket) {
socket.setTimeout(500000);
socket.setKeepAlive(true);
});
None 项有所作为!无论如何,在我添加我的 SSL 证书并且只使用 HTTP 之前,我这样定义了我的服务器:
var app = express();
// Listen on port 3000 for any calls
var server = app.listen(3000, function () {
console.log('VCS-API REST server started - yay.');
});
server.on('connection', function(socket) {
// 10 minutes timeout
socket.setTimeout(500000);
socket.setKeepAlive(true);
});
这工作正常...但是,我添加了我的 SSL 证书,现在我像这样定义服务器(这适用于在不到 2 分钟内完成的较小文件):
const httpsOptions = {cert, ca, key};
const httpsServer = https.createServer(httpsOptions, app);
// Listen on port 443 for any calls
var server = httpsServer.listen(443, function () {
console.log('VCS-API REST server started - yay.');
});
server.on('connection', function(socket) {
// 10 minutes timeout
socket.setTimeout(500000);
socket.setKeepAlive(true);
});
所以我的确切问题是:在 HTTPS 中设置超时以启用更长的文件上传的正确方法是什么?
所以我用 op 调试了一些有趣的东西,结果发现使用包“multer-s3”建立了第二个连接。
这是有问题的连接,而不是从浏览器->节点上传文件。
为了暴露问题,添加了 client error 的事件侦听器:
server.on('clientError', (err, socket) => {
console.log(err)
});
这显示超时错误
ERR_HTTP_REQUEST_TIMEOUT
未处理的错误导致整个连接关闭。只需处理事件中的错误就足以让请求按预期完成。
如果不深入研究 multer-s3 包装,当底层服务器是 https 时,看起来会出现某种超时问题。对此的修复是捕获错误,记录它并允许请求继续。