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

cud*_*mer 5 javascript error-handling request node.js

使用简单的request.js http客户端我注意到有时一个简单的TypeError可能会崩溃整个节点应用程序.以下是其中一个例子:

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

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

TypeError: Cannot read property 'statusCode' of undefined
Run Code Online (Sandbox Code Playgroud)

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

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

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

myn*_*iil 4

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

  • 始终检查是否有错误
  • 经常检查你的数据

所以,像这样的事情就很好了:

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

if (!error && response) {
  //do whatever you want with response
}
Run Code Online (Sandbox Code Playgroud)

在尝试访问对象之前,您必须确保对象存在(在不能保证对象存在的情况下)。另外,看看Maybe2模块。有了这个模块,你可以写这样的东西:

if (!error && maybe(response).getOrElse({}).statusCode == 200) {
  //your code here
}
Run Code Online (Sandbox Code Playgroud)
  • 使用node.js集群模式,supervisor模块永远喜欢在应用程序前面这样,如果一个请求失败,其他请求将由应用程序的其他实例完成。
  • 准备好在客户端处理错误并在失败时重复请求。