我试图在登录表单上显示一个简单的“电子邮件和密码不匹配”错误,但我遇到了麻烦,不确定我出错的地方是在服务器上还是在我的 React 应用程序中。我想我会在这里发帖,因为我不确定哪个 github repo 是合适的。这是服务器上的解析器:
// Schema definition:
type Mutation {
loginViewer(credentials: AUTH_CREDENTIALS): SignInPayload!
}
type SignInPayload {
token: String
expires: Int
requiresReset: Boolean
}
// Mapping the mutation to the resolver:
Mutation: {
loginViewer: loginViewerMutation,
},
// Resolver:
const loginViewerMutation = async (obj, args) => {
const { credentials } = args
const user = await User.findOne({ email })
if (!user) throw new GraphQLError('Email and password do not match')
const matches = await user.comparePassword(password)
if (!matches) throw new GraphQLError('Email and password do not match')
return createJWT(user)
}
然后,在我的登录组件中调用突变:
const mutation = gql`
mutation LoginViewer($password: String!, $email: String!) {
loginViewer(credentials: { email: $email, password: $password }) {
token
expires
requiresReset
}
}
`
export class Login extends React.Component {
handleLogin = (credentials) => {
this.props
.mutate({ variables: { ...credentials } })
.then(() => {
// ...
})
.catch((error) => {
console.log(error.message)
console.log(error.graphQLErrors)
// ...
})
}
render() {
// ...
}
}
export default graqphql(mutation)(Login)
当我提供正确的信息时,一切都按预期工作。如果我不这样做,则捕获的错误不包含 GraphQLErrors。
我正在使用具有默认设置的 apollo-link-error 中间件:https ://www.apollographql.com/docs/link/links/error.html
我的控制台如下所示:
正在返回预期的身份验证错误,并从中间件记录下来。但是,在我的 Login 组件中,error.graphQLErrors 数组是空的。
我可能在哪里出错了?
返回 500 Internal Server Error 似乎不正确——它的行为完全符合我的意愿。我是否在服务器上错误地实现了这一点?
graphQLErrors 如何在日志中间件和 .catch(error) 之间“丢失”?