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] ]
它是一个数组,不是对象,[].name
是 undefined
,它被转换为 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
}
我制作了我的第一个 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] ]
它是一个数组,不是对象,[].name
是 undefined
,它被转换为 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
}