无法使用 graphql-middleware-sentry 从 GraphQL 接收错误

Cannot receive error from GraphQL with graphql-middleware-sentry

注意:问题出在 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',
  }
}

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

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