【问题标题】:Socket timeout on long POST node.js长 POST node.js 上的套接字超时
【发布时间】:2014-01-29 12:32:48
【问题描述】:

使用 node.js http.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);
    });
});

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

info: SOCKET TIMEOUT
info: SOCKET CLOSED. IT WAS ERROR: false

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

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

socket.setKeepAlive(true);

如何防止socket bultin超时?

【问题讨论】:

    标签: node.js sockets post timeout request


    【解决方案1】:

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

    socket.setTimeout(1000 * 60 * 300); // 5 hours
    

    【讨论】:

    【解决方案2】:

    你可以做几件事:

    socket.setTimeout(/* number of milliseconds */);
    

    如果你这样做,那么服务器可以得到一个超时事件:

    server.on('timeout', function(timedOutSocket) {
      timedOutSocket.write('socket timed out!');
      timedOutSocket.end();
    });
    

    【讨论】:

    • .setTimeout 的第一个参数不是秒数,而是毫秒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2016-11-02
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多