Асинхронное / ожидание прерывания выполнения и возврата 403 с экспресс-маршрута - PullRequest
0 голосов
/ 24 января 2019

Если предположить, что 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 и выдачи ошибок, которые должны быть обнаружены.

Любые предложения приветствуются!

...