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

Posted

技术标签:

【中文标题】无法使用 graphql-middleware-sentry 从 GraphQL 接收错误【英文标题】:Cannot receive error from GraphQL with graphql-middleware-sentry 【发布时间】:2020-02-15 09:12:34 【问题描述】:

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

【问题讨论】:

响应中的errors数组中是否列出了错误?您可以在浏览器的 DevTools 的 Network 选项卡中看到来自服务器的整个响应。 嗨丹尼尔,我实际上没有得到任何回应,除了我想发回的消息的空值。例如,它通常会返回message: 'Reset token sent'。相反,它返回:message: null. 所以您正在收到响应,只是 data 属性看起来像这样: "message": null 。但是,除了data 对象之外,来自服务器的响应还可以包括errors 数组。所以我问响应中是否有errors 数组,如果有,它的内容是什么。验证这一点的唯一方法是查看您的 DevTools。 嘿,所以响应不包含错误数组。响应中唯一返回的内容(查看 DevTools 中的网络选项卡)是 "data":"requestPasswordReset":null 好的。这就是为什么 Apollo 没有显示任何错误的原因。在某个地方,您在解析器中抛出的错误被吞没了,而不是被您的 GraphQL 服务捕获。如果我必须打赌,我会说您正在使用 try/catch 而不会再次抛出错误。请使用相关解析器的代码更新您的问题。 【参考方案1】:

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

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

【讨论】:

以上是关于无法使用 graphql-middleware-sentry 从 GraphQL 接收错误的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 StorageClass 配置卷 - 无法获取存储帐户的存储密钥

Worklight Studio 和本地开发,有时无法使用 Java 类,有时无法使用 HTML 文件

ADB无法使用解决办法

Ubuntu 80端口无法使用-非root用户无法使用1024以下端口

无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别

LINUX下的mail\mailx为啥无法使用外部SMTP发邮件