Node.js + Express.js应用程序的错误处理原则?

Cli*_*ris 176 node.js express

与其他框架相比,Node.js + Express.js应用程序中的错误报告/处理似乎有所不同.我是否理解它的工作原理如下?

A) 通过接收它们作为回调函数的参数来检测错误.例如:

doSomethingAndRunCallback(function(err) { 
    if(err) { … }
});
Run Code Online (Sandbox Code Playgroud)

B) 通过调用next(err)在MIDDLEWARE中报告错误.例:

handleRequest(req, res, next) {
    // An error occurs…
    next(err);
}
Run Code Online (Sandbox Code Playgroud)

C) 通过抛出错误报告 ROUTES中的错误.例:

app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});
Run Code Online (Sandbox Code Playgroud)

d) 处理通过配置通过app.error自己的错误处理的错误()或使用通用连接错误处理程序.例:

app.error(function(err, req, res, next) {
    console.error(err);
    res.send('Fail Whale, yo.');
});
Run Code Online (Sandbox Code Playgroud)

这四个原则是Node.js + Express.js应用程序中所有错误处理/报告的基础吗?

Ray*_*nos 183

Node.js中的错误处理通常是格式A).大多数回调都返回一个错误对象作为第一个参数或null.

Express.js使用中间件,中间件语法使用B)和E)(如下所述).

C)如果你问我,这是不好的做法.

app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});
Run Code Online (Sandbox Code Playgroud)

您可以轻松地将上述内容重写为

app.get('/home', function(req, res, next) {
    // An error occurs
    next(err);
});
Run Code Online (Sandbox Code Playgroud)

中间件语法在get请求中有效.

至于D)

(07:26:37 PM)tjholowaychuk:app.error在3.x中删除

TJ刚刚确认app.error弃用了E

E)

app.use(function(err, req, res, next) {
  // Only handle `next(err)` calls
});
Run Code Online (Sandbox Code Playgroud)

任何长度为4(4个参数)的中间件都被视为错误中间件.当一个调用next(err)connect go并调用基于错误的中间件时.

  • 谢谢!对于将来可能会遇到这种情况的人,看起来"方法e"的参数的顺序实际上是err,req,res,next(而不是req,res,next,err). (11认同)
  • 所以这看起来很棒,但我看到的一个问题是,有些错误永远不会出现在你描述的错误处理程序中,并且只能被process.on('uncaughtException',fn)处理程序捕获.传统的智慧是让这种情况发生并依靠Forever等重启应用程序,但如果你这样做,你如何返回一个友好的错误页面? (9认同)
  • next(错误)本质上是Express的抛出错误的版本,你必须在你自己的中间件中明确地调用它 (3认同)

Nis*_*hth 11

Joyent的人们已经发布了一篇非常有见地的最佳实践文档.任何Node.js开发人员必读的文章.

  • https://web.archive.org/web/20160205174437/https://www.joyent.com/developers/node/design/errors (2认同)
  • 文章还不错:但文字太多而且没有足够的例子,这是一篇真正专业人士的文章 (2认同)