有没有办法将await/async try/catch块包装到每个函数中?

Nev*_*lax 11 javascript express async-await ecmascript-2017

所以我正在使用express.js并考虑使用async/await与节点7.有没有办法我仍然可以捕获错误但摆脱try/catch块?也许是函数包装器?我不确定这将如何实际执行函数的代码并调用next(err).

exports.index = async function(req, res, next) {
  try {
    let user = await User.findOne().exec();

    res.status(200).json(user);
  } catch(err) {
    next(err);
  }
}
Run Code Online (Sandbox Code Playgroud)

像这样......?

function example() {
   // Implements try/catch block and then handles error.
}

exports.index = async example(req, res, next) {
  let user = await User.findOne().exec();
  res.status(200).json(user);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

更类似的东西:

var wrapper = function(f) {
    return function() {
        try {
            f.apply(this, arguments);
        } catch(e) {
            customErrorHandler(e)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这会以某种方式处理try/catch块但不起作用:

exports.index = wrapper(async example(req, res, next) {
  let user = await User.findOne().exec();
  res.status(200).json(user);
});
Run Code Online (Sandbox Code Playgroud)

请参阅有没有办法在Javascript中为每个函数添加try-catch?对于非异步示例.

Ber*_*rgi 10

是的,您也可以轻松地为异步函数编写这样的包装器 - 只需使用async/ await:

function wrapper(f) {
    return async function() {
//         ^^^^^
        try {
            return await f.apply(this, arguments);
//                 ^^^^^
        } catch(e) {
            customErrorHandler(e)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你直接使用promises,比如在这个更适合表达的示例中(特别是参数的数量):

function promiseWrapper(fn) {
    return (req, res, next) => {
         fn(req, res).catch(next);
    };
}
Run Code Online (Sandbox Code Playgroud)