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,
    });
}

另一种有效的方法是简单地将错误抛出块外。