在node.js请求中超时

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

timeout时间过后会发生什么? 即:

 var request = require('request'); var options = { url: Theurl, timeout: 300000 }; request(options, function(error, resp, body) {... 

300000之后会发生什么? 请求是否尝试重新请求url?

我还发现Linux Kernel有一个默认的20秒TCP socket connection timeout. ( http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout )是否意味着request中的timeout选项将是最大20秒(如果我不更改Linux Kernel timeout ),无论我在options设置什么? 我使用Ubuntu

request返回错误,错误代码如请求自述文件(超时部分)中所述设置。

看看TIME_WAIT的细节。

但是,内核将会削减它的配置。 正如你的链接所述,你可以通过tcp_syn_retries来改变它。

从请求包的自述文件中:

 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]) 

如果超时发生,您的回调函数将被执行,并将错误设置为消息'错误:ETIMEDOUT'。

这个小项目https://github.com/FGRibreau/node-request-retry提供了可立即使用的配置包装器,用于由许多连接错误代码触发重试,包括超时。