Есть ли способ обернуть блок 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);
});