【问题标题】:The Apollo error doesn't contain the payloadApollo 错误不包含有效负载
【发布时间】:2021-03-28 02:50:04
【问题描述】:

在客户端捕获服务器错误。我正在传递一个带有 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

【问题讨论】:

  • 可能您正在寻找自定义错误(或格式,请参阅文档)...检查此特定错误源是否可以传递其他变量,可能只使用字段指向参数跨度>
  • 文档说它允许“错误扩展对象的任意字段为客户端提供额外的上下文”,他们提供的代码与此相同。 :|
  • 注意,您的回复不包含"code": "BAD_USER_INPUT" ...其他配置的错误处理/屏蔽/格式化? ...检查具体错误实现/源代码,而不是示例的来源

标签: graphql apollo apollo-client


【解决方案1】:

事实证明,错误被抛出在一个 try/catch 块中,该块捕获并抛出一个通用的 nodejs 错误,而不是 apollo 错误。因此,将错误类型从 Error 更改为 ApolloError 就成功了。

try {
  // ...code 
} catch {
  throw new ApolloError('InputValidationError', 'INVALID_INPUT', {
      errors,
    });
}

另一种可行的方法是简单地将错误抛出块之外。

【讨论】:

  • '他们提供的代码与此相同' ;)
  • “完全相同”:p
猜你喜欢
  • 1970-01-01
  • 2021-01-19
  • 2015-12-04
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多