防止节点类型错误崩溃应用程序

时间:2014-04-12 11:41:26

标签: javascript node.js error-handling request

使用简单的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.
    }
})

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

TypeError: Cannot read property 'statusCode' of undefined

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

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

但是如果可能的话,我宁愿不给应用添加不必要的行。我可能会遗漏一些明显的东西!任何指针都非常感激。感谢。

1 个答案:

答案 0 :(得分:4)

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

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

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

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)在应用前面。这样,如果一个请求失败,其他请求将由您的应用程序的其他实例完成。
  • 准备好在客户端处理错误,并在失败时重复请求。