Я заметил повторяющийся шаблон в моем экспресс-приложении, который, я думаю, можно оптимизировать. По сути, у меня есть маршрут, вызывающий метод с некоторыми асинхронными функциями.
index.js
const controller = require('./controller.js');
const router = new Router();
router.post('/user', controller.createUser);
module.exports = router;
controller.js
exports.createUser = async (req, res, next) => {
try {
// asynchronous calls, etc.
} catch (e) {
// pass error to middleware
next(e);
}
}
Блоки try/catch
повторяются в каждом из моих методов контроллера. Я бы хотел, чтобы обнаруженные ошибки передавались в мое промежуточное программное обеспечение для обработки ошибок. Поэтому кажется непрактичным и повторным передавать ошибки в каждой из моих функций контроллера. Могу ли я сделать рефакторинг?
Что если я оберну метод контроллера в функцию как таковую:
index.js
const controller = require('./controller.js');
const router = new Router();
const handleErrors = (func) => async (req, res, next) => {
try { await func(req, res, next) }
catch (e) { return next(e) }
};
router.post('/user', handleErrors(controller.createUser));
module.exports = router;
controller.js
exports.createUser = async (req, res, next) => {
// asynchronous calls, etc.
if (a !== b) {
// errors can be passed to middleware as such
throw new CustomError(400, 'a is not equal to b');
}
}
Было бы это подходящим решением? Есть ли у Express какие-либо встроенные способы сделать то же самое? Должен ли я быть осторожен с рефакторингом всего моего приложения таким образом?