我想知道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提供了可立即使用的配置包装器,用于由许多连接错误代码触发重试,包括超时。