具有Express的Node.js - 抛出错误vs next(错误)

时间:2015-01-06 08:26:28

标签: node.js express

有人可以在node.js Express应用程序中说明适当的时间来抛出错误:

throw new Error('my error');

或通过回调传递此错误,通常标记为'next',如下所示:

next(error);

你能否解释一下他们每个人在Express应用程序环境中会做些什么?

例如,这是一个处理URL参数的快速函数:

app.param('lineup_id', function (req, res, next, lineup_id) {
        // typically we might sanity check that user_id is of the right format
        if (lineup_id == null) {
            console.log('null lineup_id');
            req.lineup = null;
            return next(new Error("lineup_id is null"));
        }

        var user_id = app.getMainUser()._id;
        var Lineup = app.mongooseModels.LineupModel.getNewLineup(app.system_db(), user_id);
        Lineup.findById(lineup_id, function (err, lineup) {
            if (err) {
                return next(err);
            }
            if (!lineup) {
                console.log('no lineup matched');
                return next(new Error("no lineup matched"));
            }
            req.lineup = lineup;
            return next();
        });
    });

在评论的行中“//我应该在这里创建自己的错误吗?” 我可以使用“抛出新错误('xyz')”,但究竟是什么呢?为什么通常最好将错误传递给'next'回调?

另一个问题是 - 当我在开发中时,如何在控制台和浏览器中显示“抛出新错误('xyz')”?

4 个答案:

答案 0 :(得分:7)

一般来说,express遵循传递错误而不是抛出错误的方式,对于程序中的任何错误,你可以将错误对象传递给'next',还需要定义一个错误处理程序,以便将所有错误传递给下一个可以妥善处理

http://expressjs.com/guide/error-handling.html

答案 1 :(得分:3)

在回调中引发错误不起作用:

app.get('/', function (req, res) {
  fs.mkdir('.', (err) => {
    if (err) throw err;
  });
});

但是呼叫下一个作品:

app.get('/', function (req, res, next) {
  fs.mkdir('.', (err) => {
    if (err) next(err);
  });
});

答案 2 :(得分:0)

在路由处理程序和中间件内部的同步代码中发生的错误不需要任何额外的工作。如果同步代码引发错误,则Express将捕获并处理该错误。例如:

app.get('/', function (req, res) {
  throw new Error('BROKEN') // Express will catch this on its own.
})

答案 3 :(得分:0)

对于那些喜欢抛出错误的人,这里是一种变通的装饰器:

id