为 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 时,看起来会出现某种超时问题。对此的修复是捕获错误,记录它并允许请求继续。