如何通过Node.js使用请求处理超时

蒂亚戈·洛迪(Thiago Loddi)

因此,我正在向服务器发出此请求,并设置了超时,我想处理超时事件,但是我也想处理“中止”事件并使另一个事件不同。我设法快速修复,但是我想知道是否有更好的方法。代码如下:

makeRequest = function(json, cb){
    var requestError
    request({
        url: REQUEST_URL,
        json: json,
        timeout: 3000,
        headers: {
            'Content-Type': 'application/json'
        }
     }, function(err, res, body){
         if(err) requestError = err
         else cb(null, res, body)
     }).on('abort', function(){
         setTimeout(function({  
             if(requestError != 'ETIMEDOUT') cb(httpStatusCode.REQUEST_TIMEDOUT)
             else cb(httpStatusCode.REQUEST_ABORTED
         }, 1000)
     })
}

我注意到,在超时事件中,均以该顺序触发了“中止”事件并调用了请求回调,因此我使用了setTimeout函数来等待请求回调,然后处理“中止”侦听器中的错误。这似乎是一种愚蠢的方式,我在网上搜索,但没有找到一种仅处理回调事件的方式。我还注意到超时会触发on。('error',function(err){})事件,我可以在其中处理错误,但它还会调用on。('abort',function(){})事件我最终两次调用主回调(cb),导致应用程序崩溃。

有没有一种方法可以使事件仅用于超时而仅使事件具有中止,因此我不必使用setTimeout?

还是我的req对象中有任何属性可以检查该请求是否超时?

还是您有其他建议以不太丑陋的方式解决我的问题?

我正在使用nodejs 0.12.2并要求2.55.0谢谢!

jfriend00

开源的一大优点是,您始终可以仅查看模块代码并查看其工作方式。

如果您想要错误,则只需收听.on('error', function(err) {})错误将在那里传递。.on('abort', function() {})事件不会告诉您为什么它被中止。但是,从请求模块相关源代码中可以看到,该error事件总是在该abort事件之后立即发送,并且将其e.code设置为ETIMEDOUT

这是有关when的一些相关源代码的副本.abort(),您可以在该代码中看到此后立即触发错误事件:

  if (self.timeout && !self.timeoutTimer) {
    var timeout = self.timeout < 0 ? 0 : self.timeout
    self.timeoutTimer = setTimeout(function () {
      self.abort()
      var e = new Error('ETIMEDOUT')
      e.code = 'ETIMEDOUT'
      self.emit('error', e)
    }, timeout)

    // Set additional timeout on socket - in case if remote
    // server freeze after sending headers
    if (self.req.setTimeout) { // only works on node 0.6+
      self.req.setTimeout(timeout, function () {
        if (self.req) {
          self.req.abort()
          var e = new Error('ESOCKETTIMEDOUT')
          e.code = 'ESOCKETTIMEDOUT'
          self.emit('error', e)
        }
      })
    }
  }

因此,似乎您可以忽略该abort事件,而只是侦听该error事件,并仅对该事件调用回调error

如果您的代码使回调函数被多次调用而出错(听起来像是一个错误),那么它就会变得混乱,那么您可以更改makeRequest()函数,以使它永远也不会多次调用回调函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何处理Spring Boot中超时的异步请求?

如何修改Node.js请求的默认超时时间?

使用node.js测试API如何处理无效的JSON语法请求主体

如何使用node.js处理获取请求(快速)

如何使用Node.js / Passport处理未经授权的请求

如何使用Node.js通过ipfs下载文件?

如何在Vue.js中使用Axios设置获取请求的超时

通过knex.js从oracledb中使用IO在node.js中使用IO处理请求

如何使用KSQL生成处理时间超时?

单线程Node.js如何同时处理请求?

如何使用node.js在mongoDB中通过_Id查找

如何通过HTTP Get请求使用Express,Node JS和Angular返回对象数组

如何在Firebase托管上使用node.js处理根路径请求?

如何使用Sidekiq作为后台处理来渲染大型PDF,以避免Heroku的HTTP请求超时30秒?

如何通过express / node.js请求通过Internet反应的应用程序

如何使用Node.js处理不正确的POST请求?

优先级,如何使用node express js处理xmlhttprequest发布请求

如何通过node.js在JSON路径中使用数字?

如何在node.js中使用多个请求处理程序?

如果模板存在,如何自动处理获取请求(使用node.js + express)

Node.JS-使用异步功能处理传入的请求

如何通过JXCore更新Node.JS?

Node.js服务器如何处理请求?

node.js请求中的超时

如何在不使用“请求”的情况下通过 Node.js 发布 JSON?

如何使用请求方法 Node.JS 处理 cookie

如何处理在python中超时的请求-使用scapy的traceroute脚本

使用 Node.js 和 Firestore 处理来自请求的响应

如何使用for循环超时ajax请求