首页 > 解决方案 > 无法使用 graphql-middleware-sentry 从 GraphQL 接收错误

问题描述

注意:问题在于 graphql-middleware-sentry 没有转发错误。解决方案如下并标记为正确答案。

我目前在前端使用 React 和 Apollo React Hooks 处理表单,在后端使用 GraphQL-Yoga 和 Prisma 的混合物。突变工作正常,形式没问题。但我无法收到 React 后端抛出的错误。

我尝试了各种错误类型,但运气不佳。例如,我在 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',
  }
}

标签: reactjsgraphqlapolloreact-apolloprisma

解决方案


graphql-middleware-sentry有一个默认的forwardErrors参数false。您应该将其设置为true以防止它吞下您抛出的错误:

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

推荐阅读