Не удается получить ошибку от GraphQL с graphql-middleware-sentry - PullRequest
1 голос
/ 18 октября 2019

Примечание: Проблема заключалась в том, что graphql-middleware-sentry не пересылал сообщения об ошибках. Решение ниже и помечено как правильный ответ.

В настоящее время я работаю с формой, используя React и Apollo React Hooks на внешнем интерфейсе, а также смесь GraphQL-Yoga и Prisma на внутреннем интерфейсе. Мутация работает нормально, и форма в порядке. Но я не могу получать ошибки, выдаваемые бэкэндом в React.

Я пробовал различные типы ошибок, но мне не повезло. Например, моя мутация в реакции выглядит следующим образом:

 const [requestPasswordResetMutation, { data, error, loading }] = useMutation(
    REQUEST_PASSWORD_REQUEST,
    {
      errorPolicy: 'all',
    },
  )

В бэкэнде я мог бы выдать ошибку, когда адрес электронной почты не распознается. Я запускаю простую проверку, такую ​​как:

if (!user) {
    throw Error('User not found')
  }

Эта ошибка успешно вызвана и обнаружена Sentry. Но внешний интерфейс не обнаружил никаких ошибок в переменной errors. Вместо этого форма действует так, как если бы она была успешно отправлена ​​(учитывая отсутствие значений в errors объекте.

Может кто-нибудь дать мне указатель на то, как я должен сообщать об ошибках из бэкэнда ввнешний интерфейс здесь?

Код резолвера:

const requestPasswordReset = async (parent, { email }, context) => {
  const user = await context.prisma.user({
    email,
  })

  if (!user) {
    throw new Error('User not found')
  }

  const passwordResetToken = crypto.randomBytes(20).toString('hex')
  const passwordTokenExpiry = expiryDate()

  try {
    await context.prisma.updateUser({
      data: {
        passwordResetToken,
        passwordTokenExpiry,
      },
      where: {
        email: user.email,
      },
    })
  } catch (error) {
    console.error(error)
  }

  if (process.env.NODE_ENV === 'production') {
    // Send email
  }

  return {
    message: 'Reset token sent',
  }
}

1 Ответ

2 голосов
/ 18 октября 2019

graphql-middleware-sentry имеет параметр forwardErrors, который по умолчанию равен false. Вы должны установить его на true, чтобы предотвратить проглатывание ошибок, которые вы выбрасываете:

const sentryMiddleware = sentry({
  forwardErrors: true,
  ...
})
...