一尘不染

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

node.js

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

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

doSomethingAndRunCallback(function(err) { 
    if(err) { … }
});

B) 通过调用next(err) 报告 MIDDLEWARE中的​​错误。例:

handleRequest(req, res, next) {
    // An error occurs…
    next(err);
}

C) 通过抛出错误来 报告 路由中的错误。例:

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

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

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

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


阅读 241

收藏
2020-07-07

共1个答案

一尘不染

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

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

C)如果您问我,这是不好的做法。

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

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

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

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

至于D)

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

TJ刚刚确认app.error不赞成使用E

E)

app.use(function(err, req, res, next) {
  // Only handle `next(err)` calls
});

长度为4(4个参数)的任何中间件均被视为错误中间件。当一个呼叫next(err)建立连接并呼叫基于错误的中间件时。

2020-07-07