【问题标题】:delete mutation returns null [duplicate]删除突变返回 null [重复]
【发布时间】:2019-09-21 12:21:11
【问题描述】:

我有一个待办事项列表,我已经成功地添加了新项目和更新缓存,现在正在添加一个删除突变。 我的最终目标是从删除突变中返回一个 ID,该 ID 可用于更新客户端的整个待办事项列表。

我尝试将项目的 id 传递给突变,但它返回 null。

架构

type Todo {
  _id: ID!
  todo: String!
}

type RootMutation {
  deleteTodo(_id: ID!): Todo
}

解析器

  deleteTodo: async function({ _id }, req) {
    return await Todo.deleteOne({ _id });
  }

使用以下代码在 http://localhost:3000/graphql 的 graphql 界面中测试了此突变:

mutation {
  deleteTodo (_id: "example0101010101001010101aasdsadasd"){
        _id
    }
}

收到此错误

{
  "errors": [
    {
      "message": "Cannot return null for non-nullable field Todo._id.",
      "locations": [
        {
          "line": 3,
          "column": 3
        }
      ],
      "path": [
        "deleteTodo",
        "_id"
      ]
    }
  ],
  "data": {
    "deleteTodo": null
  }
}

当我将一个项目的 id 传递给突变时,它应该返回这个已删除项目的 id,但我一直为 null。 我怀疑我的解析器功能可能有问题。

链接到githubrepo

【问题讨论】:

  • 看起来您的解析器和功能正在按您的预期工作。似乎您的根突变正在返回一个不再存在的 Todo 对象。您可能希望返回一个布尔值。

标签: javascript node.js graphql express-graphql


【解决方案1】:

您可能不想在这里使用deleteOne 方法。查看type definitionsmongooseremovedeleteOnedeleteMany 不要返回已删除的文档。请改用findByIdAndRemove,这将返回已删除的文档,如果未找到则返回null。

【讨论】:

  • 是的。基本上,下面的代码解决了这个问题:const deletedTodo = await Todo.findByIdAndDelete({ _id }); return { _id: deletedTodo.id,todo: deletedTodo.todo }; 感谢您指出我正确的方向!
猜你喜欢
  • 2019-06-28
  • 2023-01-09
  • 2019-12-26
  • 2021-10-09
  • 1970-01-01
  • 2021-04-01
  • 2019-03-05
  • 2022-10-25
  • 2018-03-02
相关资源
最近更新 更多