带有Express的Node.js-抛出错误与下一个(错误)

0kjbasz6  于 2023-01-16  发布在  Node.js
关注(0)|答案(4)|浏览(124)

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

throw new Error('my error');

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

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

在注解行“//我应该在这里创建我自己的错误吗?”我可以使用“throw new Error('xyz')",但这到底会做什么?为什么通常将错误传递给回调函数'next'会更好?
另一个问题是-当我在开发时,如何让“throw new Error('xyz')”显示在控制台和浏览器中?

2q5ifsrm

2q5ifsrm1#

通常express遵循传递错误而不是抛出错误的方式,对于程序中的任何错误,您可以将错误对象传递给“next”,还需要定义一个错误处理程序,以便传递给“next”的所有错误都可以正确处理。
http://expressjs.com/en/guide/error-handling.html

6mzjoqzu

6mzjoqzu2#

在回调中抛出错误不起作用:

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

但是调用next可以:

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

jvlzgdj93#

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

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

62lalag44#

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

export function safeThrow(
    target: object,
    key: string | symbol,
    descriptor: TypedPropertyDescriptor<(req: Request, res: Response, next: NextFunction) => Promise<any>>) {
    const fun = descriptor.value;
    descriptor.value = async function () {
        try {
            await fun.apply(this, arguments);
        } catch (err) {
            arguments[2](err);
        }
    };
}

@safeThrow
private async get(req: Request, res: Response, next: NextFunction) {
  throw { status: 404, message: 'Not supported' }
}

相关问题