Не удается получить ошибку от GraphQL с помощью graphql-middleware-sentry

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

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

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

 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',
  }
}

person roo    schedule 18.10.2019    source источник
comment
Указана ли ошибка в массиве errors внутри ответа? Вы можете увидеть весь ответ сервера на вкладке Network DevTools вашего браузера.   -  person Daniel Rearden    schedule 18.10.2019
comment
Привет, Даниэль, на самом деле я не получаю ответа, кроме нулевого значения сообщения, которое я хочу отправить. Например, обычно он возвращает message: 'Reset token sent'. Вместо этого он возвращает: message: null.   -  person roo    schedule 18.10.2019
comment
Итак, вы получаете ответ, только свойство data выглядит так: { "message": null }. Однако ответ сервера может также включать массив errors в дополнение к объекту data. Поэтому я спрашиваю, есть ли в ответе массив errors, и если да, то каково его содержимое. Единственный способ проверить это - взглянуть на свои DevTools.   -  person Daniel Rearden    schedule 18.10.2019
comment
Эй, значит ответ не содержит массива ошибок. Единственное, что возвращается в ответ (глядя на вкладку сети в DevTools), это {"data":{"requestPasswordReset":null}}   -  person roo    schedule 18.10.2019
comment
Ok. Вот почему Apollo не показывает никаких ошибок. Где-то по ходу дела ошибка, которую вы бросаете внутри резолвера, проглатывается вместо того, чтобы быть обнаруженной вашей службой GraphQL. Если бы мне пришлось сделать ставку, я бы сказал, что вы используете try / catch и больше не выдаете ошибку. Обновите свой вопрос, указав код соответствующего преобразователя.   -  person Daniel Rearden    schedule 18.10.2019
comment
Если вы используете что-то вроде graphql-middleware, это тоже может поглотить ошибку.   -  person Daniel Rearden    schedule 18.10.2019
comment
Ах, в этом есть смысл. Я обновил свой вопрос кодом преобразователя. Только промежуточное ПО, которое я использую, - это обработчик ошибок часового и graphql-shield.   -  person roo    schedule 18.10.2019
comment
Похоже, что это промежуточное программное обеспечение часового, которое проглатывает ошибку!   -  person roo    schedule 18.10.2019
comment
Ага, я отправил ответ. Возможно, будет полезно обновить текст и заголовок вопроса, чтобы отразить истинную проблему - что-то вроде Не удается получить ошибку от GraphQL с помощью graphql-middleware-sentry. Это может помочь людям, у которых возникла такая же проблема, найти ваш вопрос.   -  person Daniel Rearden    schedule 18.10.2019


Ответы (1)


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

const sentryMiddleware = sentry({
  forwardErrors: true,
  ...
})
person Daniel Rearden    schedule 18.10.2019