Node.js请求超时问题

3

我想知道node.js request模块在timeout参数方面是如何工作的。

timeout时间段过后会发生什么?例如:

var request = require('request');
var options = {
    url: Theurl,
    timeout: 300000
};

request(options, function(error, resp, body) {...
300000之后会发生什么?请求是否再次尝试请求网址?
我还发现Linux内核默认有20秒的TCP套接字连接超时。(http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout)这是不是意味着request中的timeout选项将最多为20秒(如果我没有更改Linux内核超时),而不管我在options 中设置了什么?
我使用Ubuntu
3个回答

5

来自请求包的自述文件:

Note that if the underlying TCP connection cannot be established, 
the OS-wide TCP connection timeout will overrule the timeout option

在你的情况下,请求将在20秒后被中止。请求不会尝试再次请求该URL(即使超时设置为低于20000)。您需要编写自己的逻辑或使用另一个包,例如requestretry

示例:

var options = {
    url: 'http://www.gooooerererere.com/',
    timeout: 5000
}

var maxRequests = 5;

function requestWithTimeout(attempt){
    request(options, function(error,response,body){
        if(error){
            console.log(error);

            if(attempt==maxRequests)
                return;
            else
                requestWithTimeout(attempt+1);
        }
        else {
            //do something with result
        }
    });
}

requestWithTimeout(1);

您可以使用以下方法检查特定的错误消息,例如ETIMEDOUT:
if(error.code == [ERROR_MESSAGE])

你可以等待错误(请求超时)并再次调用该函数。如果需要示例,请告诉我。 - piscator
好的。是的,请提供一个示例,那将非常友善!然后我可以将其接受为答案。 - user1665355
基本上,如果“请求”无法成功连接,我想要重试。 - user1665355
request-retry中是否可以使用所有的request选项? - user1665355
我可以在聊天中问你一个问题吗? - user1665355
显示剩余4条评论

2
request返回错误,错误代码设置如request的自述文件中所述(超时部分)。
请查看TIME_WAIT的详细信息。
但是,内核将通过其配置来缩小它。如您链接中所述,您可以通过更改tcp_syn_retries来更改它。

0
如果发生超时,您的回调函数将执行,并将错误设置为消息“Error: ETIMEDOUT”。
这个小项目提供了一个预先配置好的包装器https://github.com/FGRibreau/node-request-retry,用于触发许多连接错误代码(包括超时)的重试。

好的,是否可以重试直到“request”成功? - user1665355
看一下这个项目:链接。它是一个request的包装器,具有配置的重试延迟和重试尝试次数,在最终放弃之前进行多次重试。 - Marcin T.P. Łuczyński

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