无法使用 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 文件
Ubuntu 80端口无法使用-非root用户无法使用1024以下端口