快速错误处理和异步等待

在我的Node.js应用程序中,我添加了下面的代码来捕获每个未捕获的异常:

process.on('uncaughtException', function (err: Error) {
    try {
        logger.err(err);
    } catch (err) {

    }
});

问题在于Express有它自己的默认错误处理程序,它捕获每个未捕获的异常。 现在,Express在Node(process.on)之前捕获了异常,所以我的记录器没有达到。 但是,可以添加另一个错误处理程序,它可以在执行Express之前捕获每个异常:

app.use(logErrors);

function logErrors (err: Error, req: Request, res: Response, next: NextFunction) {
    logger.err(err);
    next(err);
}

这仍然不包括每一个案例。 每当我有一个async functionawait调用时,没有例外,但是被拒绝的Promise被返回。 例如:

app.get('/foo', async function (req: Request, res: Response, next: NextFunction) {
    await bar();
});

function bar() {
    throw new Exception();
}

将不会达到我的logErrors函数,因为它不会抛出,但会返回一个被拒绝的Promise。

为了解决这个问题,我用另一个函数包装了我的Express HTTP处理程序:

app.get('/foo', wrap(async function (req: Request, res: Response, next: NextFunction) {
    await bar();
}));

function wrap(func: (req: Request, res: Response, next: NextFunction) => void) {
    return async function (req: Request, res: Response, next: NextFunction) {
        try {
            await func(req, res, next);
        }
        catch (err) {
            next(err);
        }
    }
}

next(err)将错误传递给我的处理程序。 现在,我设法捕捉我的logErrors函数的异常。

我就快完成了。 我仍然有一个我无法捕捉错误的案例。 当我在没有await关键字的情况下调用async function时,会发生这种情况(在代码的两个不同位置使用相同的函数有时很有用,一次异步调用,一次同步)。 所以这段代码不会发现错误:

app.get('/foo', wrap(async function (req: Request, res: Response, next: NextFunction) {
    bar();
}));

这里发生的事情是Express HTTP处理程序将解析的Promise返回给wrap函数。 wrap函数反过来也没有到达catch块,所以它不会调用next(err) ,它会到达我的记录器。

bar函数依次返回一个被拒绝的Promise,但是没有人等待它的返回值。

我怎样才能以这样的方式更改我的代码?我不会以未处理的Promise拒绝为结束? (只有通用解决方案)


还有另一个process.on事件可以为 - unhandledRejection设置一个监听器。

您可以使用它来处理代码中的所有拒绝。

注意 :请记住在记录所有需要的内容后终止您的过程。 更多关于这里。


我找到了一个解决方案:

app.get('/foo', async function (req: Request, res: Response, next: NextFunction) {
    dontAwait(() => bar());
});

async function dontAwait(func: () => void) {
   try {
       await func();
   }
   catch (err) {
     logErrors(err);
   }
}

我仍然有一个我无法捕捉错误的案例。

你可以,但是你现在根本就不会对结果做任何事情。 如果你想要通常的错误处理程序触发,你需要await它。

当我在没有await关键字的情况下调用async function时会发生这种情况

我看不出有什么好的理由。 但是,如果你真的想开枪并忘记这个功能,你可以做到。 你只需要明确地处理错误:

bar().catch(e => logger.err(e));
链接地址: http://www.djcxy.com/p/37933.html

上一篇: Express error handling and async await

下一篇: How to pipe live video frames from ffmpeg to PIL?