快速错误处理和异步等待
在我的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 function与await调用时,没有例外,但是被拒绝的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));
