【问题标题】:Preventing Node TypeError crashing app防止 Node TypeError 使应用程序崩溃
【发布时间】:2014-05-26 15:09:14
【问题描述】:

使用简单的request.js http client 我注意到有时简单的TypeError 会导致整个节点应用程序崩溃。举一个例子:

request('http://www.google.com', function (error, response, body) {
    if (!error && response.statusCode == 200) {
       console.log(body) // Print the google web page.
    }
})

现在,假设 Google 没有响应并且连接挂起然后超时的假设情况(在 Google 的情况下!)。此代码只是使节点应用程序崩溃,因为response 未定义,因此无法读取response.statusCode。这会冒泡到事件循环并触发崩溃并出现错误:

TypeError: Cannot read property 'statusCode' of undefined

防止这种情况发生的最简单方法是什么?我可以在检查 statusCode 之前添加检查 error 的值,例如:

request('http://www.google.com', function (error, response, body) {
    if (!error) {
        if (response.statusCode == 200) {
          // do stuff
        }
    }
})

但如果可能的话,我宁愿不要在应用程序中添加不必要的行。我可能在这里遗漏了一些明显的东西!任何指针都非常感谢。谢谢。

【问题讨论】:

    标签: javascript node.js error-handling request


    【解决方案1】:

    简短的回答:这就是你得到的。 详细回答:

    • 始终检查错误
    • 始终检查您的数据

    所以,这样的事情还不错:

    if (!error && body) {
      //do whatever you want with your body
    }
    
    if (!error && response) {
      //do whatever you want with response
    }
    

    在尝试访问它之前,您必须确保该对象存在(在无法保证对象存在的情况下)。另外,看看maybe2 模块。有了这个模块,你可以这样写:

    if (!error && maybe(response).getOrElse({}).statusCode == 200) {
      //your code here
    }
    
    • 在应用程序前使用 node.js 集群模式、forever 之类的主管模块和/或 nginx 之类的负载平衡代理。这样,如果一个请求失败,其他请求将由您应用的其他实例来满足。
    • 准备好在客户端处理错误并在失败时重复请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-26
      • 2013-03-08
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多