长 POST Node.js 上的套接字超时

kol*_*bet 6 sockets post timeout request node.js

使用node.jshttp.createServer监听POST请求。如果请求快速完成,则一切正常。如果请求完成时间 > 5 秒,我不会收到返回给客户端的响应。

在创建的套接字上添加了事件侦听器:

server.on('connection', function(socket) {
    log.info('SOCKET OPENED' + JSON.stringify(socket.address()));
    socket.on('end', function() { 
      log.info('SOCKET END: other end of the socket sends a FIN packet');
    });

    socket.on('timeout', function() { 
      log.info('SOCKET TIMEOUT');
    });

    socket.on('error', function(error) { 
      log.info('SOCKET ERROR: ' + JSON.stringify(error));
    });

    socket.on('close', function(had_error) { 
      log.info('SOCKET CLOSED. IT WAS ERROR: ' + had_error);
    });
});
Run Code Online (Sandbox Code Playgroud)

在请求中间收到这些消息(开始后大约 10 秒后):

info: SOCKET TIMEOUT
info: SOCKET CLOSED. IT WAS ERROR: false
Run Code Online (Sandbox Code Playgroud)

但客户端套接字没有关闭,因此客户端等待响应。请求成功完成,响应已发送(在关闭的套接字上!),但客户端仍在等待。

不知道如何阻止这些超时。从代码中删除了所有超时。尝试添加KeepAlive,没有结果。

socket.setKeepAlive(true);
Run Code Online (Sandbox Code Playgroud)

如何防止socket超时?

Bad*_*yon 5

从节点的setTimeout 文档来看,发生超时时连接不会被切断。这就是浏览器仍在等待的原因。您仍然需要 end() 或 destroy() 套接字。您可以通过在套接字上调用 setTimeout 来增加超时。

socket.setTimeout(1000 * 60 * 300); // 5 hours
Run Code Online (Sandbox Code Playgroud)

  • 1000 * 60 * 300 不是 5 分钟,而是 5 小时 (5认同)