1

在 nodejs express 中处理异常,检查回调中的错误为:

if(err!==null){
    next(new Error ('Erro Message')); 
}

进而调用 express 的错误处理程序中间件。

app.use(function(err, req, res, next){
    if(!err) return next();
    console.log('<-------Error Occured ----->');
    res.send(500, JSON.stringify(err, ['stack', 'message']));
});

但是要调用 invoke next(err) ,我不得不在所有回调方法中通过所有 layers传递next的引用。我觉得这是一个混乱的方法。有没有更好的方法来处理异常并使用事件或域发送正确的响应。

4

2 回答 2

1

您应该始终通过调用 next 将路由/控制器中的错误委托给错误处理程序(这样您就可以在一个地方处理它们,而不是将它们分散在整个应用程序中)。

这是一个例子:

app.get('/', function(req, res, next) {
  db.findUser(req.params.userId, function(err, uid) {
    if (err) { return next(err); }

    /* ... */
  });
});

/* Your custom error handler */

app.use(function(err, req, res, next) {
  // always log the error here

  // send different response based on content type
  res.format({
    'text/plain': function(){
      res.status(500).send('500 - Internal Server Error');
    },

    'text/html': function(){
      res.status(500).send('<h1>Internal Server Error</h1>');
    },

    'application/json': function(){
      res.send({ error: 'internal_error' });
    }
  });
});

注意:您不必检查err错误处理程序中的参数,因为它始终存在。

同样非常重要:总是这样做,return next(err);因为您不希望执行成功代码。

您的两个代码示例都存在缺陷:在您未使用的第一个return next(err)和您使用过的第二个中return next(err),因此后面的代码不应处理错误(因为如果出现错误,它永远不会到达那里),但它应该是“成功”代码。

于 2013-11-15T08:37:26.197 回答
0

Express 的错误页面示例显示了处理错误的规范方法:

https://github.com/visionmedia/express/blob/master/examples/error-pages/index.js

// error-handling middleware, take the same form
// as regular middleware, however they require an
// arity of 4, aka the signature (err, req, res, next).
// when connect has an error, it will invoke ONLY error-handling
// middleware.

// If we were to next() here any remaining non-error-handling
// middleware would then be executed, or if we next(err) to
// continue passing the error, only error-handling middleware
// would remain being executed, however here
// we simply respond with an error page.
于 2013-11-14T18:15:02.613 回答