Выполнение кода напрямую вызывает исключение правильно, но внутри функции это не так - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь выбросить исключение в асинхронный код.Если я выбрасываю его прямо так, он работает нормально.Пример:

  Query: {
    requisitions: async (parent, args, { req }, info) => {
      const user = await Auth.findOne({ _id: req.session.userId }).select('roles')
      if (!user.roles.some(role => ['driver', 'requestant'].includes(role))) {
        throw new ForbiddenError(ErrorCodes.UNAUTHENTICATED)
      }

      return true
    }
}

Но если я сделаю вспомогательную функцию для этого, она не будет работать.Мне нужна вспомогательная функция, потому что эта проверка ролей необходима во многих местах приложения.

  Query: {
    requisitions: async (parent, args, { req }, info) => {
      hasRights(req, ['driver', 'requestant'])

      return true
    }
}

export const hasRights = async (req, allowedRoles) => {
    const user = await Auth.findOne({ _id: req.session.userId }).select('roles')
    if (!user.roles.some(role => allowedRoles.includes(role))) {
      throw new ForbiddenError(ErrorCodes.UNAUTHENTICATED)
    }
}

Примечание: hasRights экспортируется из другого файла.

Я перепробовал все комбинации попытки/ catch блоки в обоих файлах, но я просто получаю UnhandlePromiseRejectionWarning в консоли сервера, но распознаватель requisitons продолжает выполняться.Я хочу, чтобы это прекратилось, если выдается исключение.Я понятия не имею, почему это работает только в одну сторону, а не в другую, хотя это одно и то же.Любая помощь приветствуется.Благодаря.

1 Ответ

1 голос
/ 07 июля 2019

Вызов hasRights(req, ['driver', 'requestant']) может вернуть отклоненное обещание, но у вас нет кода, чтобы когда-либо справиться с этим.Таким образом, это необоснованный отказ.

Когда бросок встроен, он перехватывается функцией async requsitions(), которая затем возвращает отклоненное обещание, поэтому вызывающий requisitions() может его поймать.

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

Query: {
  requisitions: async (parent, args, { req }, info) => {
    await hasRights(req, ['driver', 'requestant'])
    return true
  }
}

Это позволит async requisitions() функция для автоматического определения отклонения от hasRights() точно так же, как это было в исходном встроенном throw.

Вам, конечно же, нужно убедиться, что вы правильно обрабатываете отклоненные обещания при вызове requisitions().


Мне также кажется, что вы должны знать, что выполнение throw внутри функции async будет автоматически перехвачено функцией async и преобразовано в отклонение обещания.это возвращается функцией async.Это функция async функций.

...