FakeData "Error: Cannot return null for non-nullable field"

FakeData "Error: Cannot return null for non-nullable field"

我制作了我的第一个 apollo 服务器来尝试理解它,到目前为止,我正在使用我创建的数组对其进行测试,并使用 graphQL 游乐场测试我的变异。

我的数据是一个大数组,像这样:

const lists = [
    {
      id: 'list-0',
      name: 'Example 1',
      tasks: [{name:"task1", id:"1", completed: false},{name:"task2", id:"2", completed: true}, ]
      },
    {
      id: 'list-1',
      name: 'Example 2',
      tasks: [{name:"task1", id:"1", completed: false},{name:"task2", id:"2", completed: true}, ]
    },
  ];

到目前为止,我可以添加列表名称、删除列表以及按 ID 获取列表。我想做的是,将一个新的任务对象添加到列表中。

我的突变和类型是这样的:

type Task {
  id: String!
  name: String!
  completed: Boolean!
}

type List {
  id: String!
  name: String!
  tasks: [Task!]!
}

addTask(listId: String!, name: String!): Task!

我为解析器创建的函数 addTask 是这样的:


        addTask(parents, {listId, name}) {
            const newTask = lists.map((list) => {
              if (listId === list.id) {
                return {
                  ...list,
                tasks: [...list.tasks, { name, completed: false, id:"eaz"}],
              };
            }
            console.log("test1", list)
            return list
            })
            console.log("test2", newTask)
            return newTask
          },

当我使用 graphQL playground 时,我将我的 list.id 之一作为目标,如下所示,但控制台日志告诉我任务:[ [Object], [Object] ] 和 graphQL playground bring tell me tasks为空。

mutation Mutation {
  addTask(listId: "task-0", name: "eze") {
    name
  }
}

我是否遗漏了有关 graphQL 的内容?我应该将数组任务和列表分开吗? 感谢阅读。

在您的控制台日志中,newTask 看起来像这样:

[ [Object], [Object] ]

它是一个数组,不是对象,[].nameundefined,它被转换为 null

根据您的类型定义,您必须return一个具有以下结构的对象:

type Task {
  id: String!
  name: String!
  completed: Boolean!
}

相反,如果您的代码执行类似这样的操作,我想它会让您想要您说的是 returning:

  addTask(parents, { listId, name }) {
    let newTask
    lists.forEach((list) => {
      if (listId === list.id) {
        newTask = { name, completed: false, id: 'eaz' }
        list.tasks.push(newTask)
      }
      console.log('test1', list)
      return list
    })
    console.log('test2', newTask)
    return newTask
  }

这里的newTask是对象{ name, completed: false, id: 'eaz' }


加分项:

替代 .map 或 .forEach,循环遍历每个项目,不管是什么,你可以做一些更有效的事情,比如

  addTask(parents, { listId, name }) {
    const newTask = { name, completed: false, id: 'eaz' }
    const list = lists.find((list) => {
      return listId === list.id
    }
    if (!list) throw new Error('listId not found')
    list.tasks.push(newTask)
    console.log('test1', list)
    console.log('test2', newTask)
    return newTask
  }