2012-12-29 27 views
0

如果某些底层组件发出错误,我如何才能通知express.js堆栈呢?我正在使用一个底层的数据访问框架,它偶尔会抛出特定的错误(例如,当在数据库中找不到记录时)。当发生错误时,将响应重定向到HTTP 500错误处理程序

express.js提供了一种直接跳转到500错误处理程序并将响应重定向到相应页面的方法吗?不幸的是,我没有看到直接的方式来使用标准的express.js方式(使用next中间件处理程序),除非可能,如果我使用try ... catch无处不在,这也有点开销

+1

如何关于res.send(500,{error:'something blew up'}); ?或者我得到的问题是错的? – gmaliar

+1

如果我的数据访问组件引发错误,它将超出当前快速路由器方法的范围。在最简单的情况下,它会导致节点崩溃的应用程序,除非我使用try ... catch无处不在 – preslavrachev

回答

0

通常你不会重定向到500页。你所做的就是让异常传播,如果抛出异常,node.js会为你做500。

我有一些我遵循的相关规则。也许你会发现它们很有用:

  • 不要在异步代码中使用try/catch(如node.js)。错误通常通过提供的回调的第一个参数传播。
  • 如果我需要一个错误返回给用户,我使用res.send('Error', 500);
+0

我不明白一件事。如果某个组件实际上抛出了异常(throw ne Error(...)),那么在我的路由器处理程序方法中几乎没有任何东西可以向前传递该异常,除非使用try ... catch 。否则,该异常只会使节点崩溃应用程序 – preslavrachev

+1

在node.js中,如果发生异常,那么应该让应用程序崩溃,并修复引发该异常的错误,以及少量异常(如验证程序模块)。 这是因为大多数node.js模块不会抛出异常,因此node.js中的异常通常表示代码中存在错误。 – sqreept

+0

所以它更多的是一个约定,对。如果您想传播异常,只需使用“下一个”处理程序(如果有)处理即可。如果你想表明一个严重的错误,你扔它。它是否正确?这似乎不同于其他环境,如Java,例如 – preslavrachev

0

东西对于那些谁仍然在寻找一个答案像我这样它:

1-使用快递默认的ErrorHandler中间件

app.use(express.errorHandler()); 

或者

2-提供自己的错误处理中间件:

app.use(function (error, req, res, next) { 
      res.status(500); 
      res.render("500.jade", {}); 
     }); 

理想情况下,你会想使用DEV第一个选项,在PROD

// development only 
if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

app.use((function (error, req, res, next) { 
    res.status(500); 
    res.render("500.jade", {}); 
}); 

注二等之一:错误处理程序应策略性地放置下面的app.router

相关问题