Если предположить, что node.js LTS и использование async ожидают, как правильно прервать выполнение? Я покажу обещанную версию и асинхронную / ожидающую версию, чтобы продемонстрировать проблему -
В версии async / await, например, если из checkUserRouteRequirements
выдается ошибка и 403
отправляется обратно из API, экспресс продолжает выполнение кода и также пытается res.json(result);
.
Я бы предпочел, чтобы .catch
был в методе validateRoute
для повторного использования, поскольку возможно сотни маршрутов и, конечно, не было бы ошибки при попытке отправить заголовки дважды.
Async / Await
router.get('/', async (req, res, next) => {
await validateRoute(roles.Approved, req, res, next);
// await does not break code execution
const result = await channelsService.getAll();
return res.json(result);
});
async function validateRoute(role, req, res, next) {
return checkUserRouteRequirements(req.user.sub, role).catch(error => {
res.status(403).json({});
});
}
Promisified
router.get('/', (req, res, next) => {
validateRoute(roles.Approved, req, res, next).then(() => {
channelsService.getAll().then(result => { return res.json(result) });
});
});
function validateRoute(role, req, res, next) {
return checkUserRouteRequirements(req.user.sub, role).catch(error => {
res.status(403).json({});
});
}
Я не поклонник повсеместного размещения try / catch и выдачи ошибок, которые должны быть обнаружены.
Любые предложения приветствуются!