防止Node TypeError导致应用程序崩溃

5

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

现在,假设(以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
        }
    }
})

如果可能的话,我不想在应用程序中添加不必要的行。也许我漏掉了一些显而易见的东西!非常感谢任何指导。谢谢。

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接