无法使用 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,
...
})
注意:问题出在 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,
...
})