Node.js和Express-抛出错误vs下一个(错误)

Node.js和Express-抛出错误vs下一个(错误),node.js,express,Node.js,Express,有人能解释一下,在node.js Express应用程序中,什么时候抛出这样的错误是合适的: throw new Error('my error'); 或者通过通常标记为“下一步”的回调传递此错误,如下所示: next(error); 您能否解释一下,在Express应用程序中,他们每个人都会做些什么 例如,下面是一个处理URL参数的express函数: app.param('lineup_id', function (req, res, next, lineup_id) {

有人能解释一下,在node.js Express应用程序中,什么时候抛出这样的错误是合适的:

throw new Error('my error');
或者通过通常标记为“下一步”的回调传递此错误,如下所示:

next(error);
您能否解释一下,在Express应用程序中,他们每个人都会做些什么

例如,下面是一个处理URL参数的express函数:

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')”显示在控制台和浏览器中?

在general express中,遵循传递错误而不是抛出错误的方式,对于程序中的任何错误,可以将错误对象传递到“next”,此外,还需要定义一个错误处理程序,以便能够正确处理传递给next的所有错误


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

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

在回调中抛出错误无效:

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);
  });
});

对于那些喜欢抛出错误的人,这里有一个变通方法装饰器:

导出函数safeThrow(
目标:目标,,
键:字符串|符号,
描述符:类型属性描述符承诺>){
const fun=descriptor.value;
descriptor.value=异步函数(){
试一试{
等待乐趣。应用(这个,论点);
}捕捉(错误){
参数[2](错误);
}
};
}
@安全投掷
专用异步获取(请求:请求,响应:响应,下一步:下一步函数){
抛出{状态:404,消息:'不受支持'}
}

如何将状态代码添加到此错误中<代码>抛出新错误('Error',404)不起作用。常量err=新错误('Error message');err.statusCode=404;犯错误;