Есть ли способ обернуть блок await/async try / catch для каждой функции?

поэтому я использую 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);
  }
}

что-то вроде этого...?

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

EDIT:

что-то более похожее на это:

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

Это как-то справится с блоком try / catch, но не работает:

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

посмотреть есть ли способ добавить try-catch к каждой функции в Javascript? для примера без асинхронности.

2 ответов


Да, вы можете легко написать такую оболочку для асинхронных функций - просто используйте async/await:

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

или вы используете обещания напрямую, как в этом примере, который более приспособлен для выражения (особенно с количеством параметров):

function promiseWrapper(fn) {
    return (req, res, next) => {
         fn(req, res).catch(next);
    };
}

подобный ответ здесь надежда может помочь вам

const sthError = () => Promise.reject('sth error');

const test = opts => {
  return (async () => {

    // do sth
    await sthError();
    return 'ok';

  })().catch(err => {
    console.error(err); // error will be catched there 
  });
};

test().then(ret => {
  console.log(ret);
});