我的上传系统运行良好,但是由于我在快递服务器上实施了SSL,因此将其切断,任何花费2分钟以上的上传都会失败,并且我得到net::ERR_FAILED
,而以前任何大小的文件都可以花费了它想要的时间,最终到达了那里,但是现在恰好2分钟,它停止了。
我调查了很多帖子,讨论节点中HTTPS的超时。
从那些我尝试过的超时设置中有很多不同的变化,但是似乎没有任何作用。
我尝试过的事情示例:
在我的帖子中:
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);
});
这些都没有改变!无论如何,在我添加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中设置超时以启用更长的文件上传的正确方法是什么?
答案 0 :(得分:2)
因此,用op调试它很有趣,结果发现使用软件包“ multer-s3”建立了第二个连接。
这是发生问题的连接,而不是从浏览器->节点上载的文件。
要揭露此问题,添加了client error的事件侦听器:
server.on('clientError', (err, socket) => {
console.log(err)
});
显示超时错误
ERR_HTTP_REQUEST_TIMEOUT
未处理的错误导致整个连接关闭。只需处理事件中的错误就足以使请求按预期完成。
如果不研究multer-s3封装,则当基础服务器为https时似乎会出现某种超时问题。解决此问题的方法是捕获错误,记录错误并允许请求继续。