【问题标题】:How to force request function terminate in node.js if the response is not returned after a long time?如果长时间未返回响应,如何在 node.js 中强制请求函数终止?
【发布时间】:2015-11-16 09:26:00
【问题描述】:

我的程序必须处理大量请求,其中一些请求有时无法获得返回的回调(因为我发送请求的服务器)。我想知道是否有任何方法可以强制请求在一定时间(例如 5 秒)后终止?

request(item.url, function (error, response, html) {})

非常感谢您的帮助。 提前致谢。

【问题讨论】:

  • this question 对您有帮助吗?似乎您可以获取request() 调用的返回值,然后在五秒后调用setTimeout(requestReturnValue.abort.bind(requestReturnValue), 5000) 以中止请求。不过,我不知道 Node.js,所以我可能错了。
  • 我可以只写 setTimeout(requestReturnValue.abort(), 5000) 吗? @NobleMushtak
  • 你可以试试。我不知道 Node.js 是如何工作的,所以它可以工作。但是,通常,我在将方法传递给setTimeout() 时使用Function.prototype.bind,因此方法中this 的值不会丢失。
  • @NobleMushtak 非常感谢。我现在就试试:)
  • @NobleMushtak 我刚刚尝试过,但它可以工作,但以其他方式。我有 100 个请求,当我使用“setTimeout(requestReturnValue.abort.bind(requestReturnValue), 5000)”时,它不会中止每个请求,它会在 5 秒后中止所有 100 个请求。 (我用setInterval按时间间隔触发100个请求,比如10ms)

标签: javascript node.js callback terminate


【解决方案1】:

request 模块有一个timeout option

timeout - 包含在中止请求之前等待服务器发送响应标头(并启动响应正文)的毫秒数。请注意,如果无法建立底层 TCP 连接,则 OS 范围的 TCP 连接超时将推翻 timeout 选项 (the default in Linux can be anywhere from 20-120 seconds)。

【讨论】:

  • 谢谢。但是,有一件事我仍然感到困惑。如果服务器在超时结束之前发送响应头(并启动响应正文),请求仍然中止吗?
  • 正如文档所说,它会在收到标头之前中止请求。但是,一旦您看到 response 事件,如果您想限制完成响应所需的时间,您可以启动自己的计时器。
  • 这是我的例子:jsfiddle.net/oe6freko。在处理大量请求时,此示例有时会打印出req.abort is excuted AFTER response is returned in callback function。你能帮我解决这个案子吗? @mscdex
  • 如果在回调函数中返回响应,我不希望req.abort被执行(不应该调用req.setTimeout(myTimeout, callback)中的回调函数)
猜你喜欢
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2018-07-31
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
相关资源
最近更新 更多