NPM 请求模块(REST 客户端)的默认超时是多少?

Posted

技术标签:

【中文标题】NPM 请求模块(REST 客户端)的默认超时是多少?【英文标题】:What is the default timeout for NPM request module (REST client)? 【发布时间】:2017-02-05 06:44:25 【问题描述】:

接下来是我的 node.js 调用以检索一些数据,这需要超过 1 分钟。这将在 1 分钟(60 秒)时超时。我也为延迟放置了一个控制台日志。但是我已将超时配置为 120 秒,但它没有反映。我知道默认级别的 nodejs 服务器超时是 120 秒,但我仍然从这个 request 模块中获得了这个调用的超时(60 秒)。请提供您对此的见解。

var options = 
  method: 'post',
  url:url,
  timeout: 120000,
  json: true,
  headers: 
    "Content-Type": "application/json",
    "X-Authorization": "abc",
    "Accept-Encoding":"gzip"
  

var startTime = new Date();
request(options, function(e, r, body) 
  var endTime = new Date();
  var latencyTime = endTime - startTime;
  console.log("Ended. latencyTime:"+latencyTime/1000);
  res.status(200).send(body);

);

【问题讨论】:

【参考方案1】:

从request options docs,向下滚动到timeout 条目:

timeout - 整数,包含在中止请求之前等待服务器发送响应标头(并启动响应正文)的毫秒数。请注意,如果无法建立底层 TCP 连接,则 OS 范围的 TCP 连接超时将覆盖超时选项(Linux 中的默认值可以是 20-120 秒)。

注意最后一部分“如果无法建立底层 TCP 连接,则 OS 范围的 TCP 连接超时将推翻超时选项”。

Timeouts 上还有一个完整的部分。基于此,以及您的代码示例,我们可以这样修改请求示例

request(options, function(e, r, body) 
  if (e.code === 'ETIMEDOUT' && e.connect === true)
  // when there's a timeout and connect is true, we're meeting the
  // conditions described for the timeout option where the OS governs
  console.log('bummer');
  
);

如果这是真的,您需要确定更改操作系统设置是否可行且可接受(这超出了此答案的范围,这样的问题在服务器故障上会更好)。

【讨论】:

嗨,马修,我收到了这个错误。 [错误:读取 ECONNRESET] 代码:'ECONNRESET',errno:'ECONNRESET',系统调用:'read'。有什么想法为什么我会得到这个?通过 REST 客户端(POSTMAN/ 等),我能够在 1 秒内得到响应。但是通过这个节点模块需要一些时间。当我 cat /proc/sys/net/ipv4/tcp_syn_retries 时,我得到了 6 的值。 首先,如果ECONNRESET 是错误,那么超时不是问题。你有一个不同的问题,你应该看到另一个 Stack Overflow 答案:***.com/a/17637900/2247344 这个答案仍然正确吗?当我尝试使用它或任何选项时,e 或 error 参数从不包含 code 属性或 connect 属性。它确实包含一条消息说超时 我已经有几个月没用过request了,但是文档和这个答案是一致的。所以我不能肯定地说,但似乎模块仍然是这样构建的(或者已经改变但文档没有更新?)。

以上是关于NPM 请求模块(REST 客户端)的默认超时是多少?的主要内容,如果未能解决你的问题,请参考以下文章

REST网络请求

Spring Boot REST API - 请求超时?

spring boot 2.2中默认的rest api超时是啥

Jersey REST 服务抛出超时异常

AngularJS $http 服务请求的默认超时是多少?

ES批量操作超时问题处理