Apollo 错误不包含负载
The Apollo error doesn't contain the payload
在客户端捕获服务器错误。我正在传递一个带有 Apollo 错误的对象,我从中了解到出了什么问题。我在整个项目中一直在使用这种方法并且它工作正常,但由于某种原因在这个特定实例中,它没有。我没有做任何不同的事情,但有效负载不存在。
服务器代码:
const { UserInputError } = require('apollo-server-express');
const commentResolver = {
Mutation: {
createComment: async (_, { postID, body }, context) => {
const user = checkAuth(context);
// empty error object I fill with messages and pass it with the error
const errors = {};
try {
if (body.trim() === '') {
errors.body = 'Comments must not be empty';
throw new UserInputError('Empty comment', { errors });
}
// ...more code
客户代码:
const [submitComment] = useMutation(CREATE_COMMENT, {
variables: {
postID,
body: comment,
},
onError: (err) => {
console.log(err.graphQLErrors[0].extensions.exception.errors); // prints undefined
setErrors(err.graphQLErrors[0].extensions.exception.errors);
},
仅打印 err 对象时得到的结果:
no errors field in it
事实证明,错误是在 try/catch 块中抛出的,该块捕获并抛出通用 nodejs 错误而不是 apollo 错误。因此,将错误类型从 Error
更改为 ApolloError
就成功了。
try {
// ...code
} catch {
throw new ApolloError('InputValidationError', 'INVALID_INPUT', {
errors,
});
}
另一种有效的方法是简单地将错误抛出块外。
在客户端捕获服务器错误。我正在传递一个带有 Apollo 错误的对象,我从中了解到出了什么问题。我在整个项目中一直在使用这种方法并且它工作正常,但由于某种原因在这个特定实例中,它没有。我没有做任何不同的事情,但有效负载不存在。
服务器代码:
const { UserInputError } = require('apollo-server-express');
const commentResolver = {
Mutation: {
createComment: async (_, { postID, body }, context) => {
const user = checkAuth(context);
// empty error object I fill with messages and pass it with the error
const errors = {};
try {
if (body.trim() === '') {
errors.body = 'Comments must not be empty';
throw new UserInputError('Empty comment', { errors });
}
// ...more code
客户代码:
const [submitComment] = useMutation(CREATE_COMMENT, {
variables: {
postID,
body: comment,
},
onError: (err) => {
console.log(err.graphQLErrors[0].extensions.exception.errors); // prints undefined
setErrors(err.graphQLErrors[0].extensions.exception.errors);
},
仅打印 err 对象时得到的结果: no errors field in it
事实证明,错误是在 try/catch 块中抛出的,该块捕获并抛出通用 nodejs 错误而不是 apollo 错误。因此,将错误类型从 Error
更改为 ApolloError
就成功了。
try {
// ...code
} catch {
throw new ApolloError('InputValidationError', 'INVALID_INPUT', {
errors,
});
}
另一种有效的方法是简单地将错误抛出块外。