如何在Node.js中为客户端HTTP连接设置超时时间?

11

我正在编写一个需要与服务器通信的Node.js应用程序。它使用以下代码建立http连接:

var client = http.createClient(u.port, u.hostname, u.secure);
client.on("error", function(exception) {
    logger.error("error from client");
});
var request = client.request(method, u.path, headers);

我在 node.js 文档中没有找到设置连接超时的选项,它似乎默认为20秒。我的问题是,我们的数据中心位于美国,而在中国的用户使用似乎比较慢或不稳定的网络,有时会在连接时出现超时错误。我想将超时时间增加到1分钟,看看是否可以解决这个问题。

在 node.js 中有没有办法做到这一点?


1
正确答案都在这个重复的问题中:https://dev59.com/j2025IYBdhLWcg3wHR4Y(特别是看douwe的回答) - Sandman4
可能是如何在Node.js中设置http.request()的超时时间?的重复问题。 - Andrew Marshall
4个回答

8

试试

request.socket.setTimeout(60000); // 60秒


1
这是正确的答案,至少有节点边缘... https://github.com/ry/node/blob/master/lib/http.js#L774 - Quickredfox

4
我认为您可以做类似以下的事情:

我认为您可以做类似以下的事情:

request.connection.setTimeout(60000)

request.connection返回与连接关联的net.Stream对象。而net.Stream具有setTimeout方法。


不起作用。我还发现有一个client.setTimeout()方法,它也不起作用。我认为这些是连接上的流量超时,而不是建立连接的超时。 - Dan List
好的。那么...我会再仔细查看一些代码。也许值得检查一下一些节点框架如何处理这个问题。 - Toby Hede
谢谢,这解决了我的WebSocket代理问题;)连接在一分钟左右后就会断开。 - Van Coding

3
Node没有增加连接超时的能力。通常,连接超时(即连接建立超时)是操作系统范围内所有应用程序的设置(例如,在Windows中为21秒(链接1),在Linux中为20到120秒之间(链接2))。请参见{{link3:Request包中的超时}}。
相反,Node允许设置减少的超时时间,并在连接尚未建立的情况下中止连接。
在连接已建立的情况下,可以根据文档控制进一步的超时时间(请参见{{link4:request.setTimeout}},{{link5:socket.setTimeout}})。

2

在设置超时之前,必须先等待客户端套接字连接建立。为此,请添加“socket”事件的回调函数:

req.on('socket', function (socket) {
    myTimeout = 500; // millis
    socket.setTimeout(myTimeout);  
    socket.on('timeout', function() {
        console.log("Timeout, aborting request")
        req.abort();
    });
}).on('error', function(e) {
    console.log("Got error: " + e.message);
    // error callback will receive a "socket hang up" on timeout
});

查看这个答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接