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

时间:2019-10-18 11:14:46

标签: reactjs graphql apollo react-apollo prisma

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

1 个答案:

答案 0 :(得分:2)

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

true