设置HTTPS超时的正确方法

时间:2020-10-27 11:55:24

标签: node.js express ssl https timeout

我的上传系统运行良好,但是由于我在快递服务器上实施了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中设置超时以启用更长的文件上传的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

因此,用op调试它很有趣,结果发现使用软件包“ multer-s3”建立了第二个连接。

这是发生问题的连接,而不是从浏览器->节点上载的文件。

要揭露此问题,添加了client error的事件侦听器:

server.on('clientError', (err, socket) => {
  console.log(err)
});

显示超时错误

ERR_HTTP_REQUEST_TIMEOUT

未处理的错误导致整个连接关闭。只需处理事件中的错误就足以使请求按预期完成。

如果不研究multer-s3封装,则当基础服务器为https时似乎会出现某种超时问题。解决此问题的方法是捕获错误,记录错误并允许请求继续。

相关问题