删除突变返回 null [重复]

Posted

技术标签:

【中文标题】删除突变返回 null [重复]【英文标题】:delete mutation returns null [duplicate] 【发布时间】: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 对象。您可能希望返回一个布尔值。 【参考方案1】:

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

【讨论】:

是的。基本上,下面的代码解决了这个问题:const deletedTodo = await Todo.findByIdAndDelete( _id ); return _id: deletedTodo.id,todo: deletedTodo.todo ; 感谢您指出我正确的方向!

以上是关于删除突变返回 null [重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有 Stripe 和 MongoDB 集成的 GraphQL 突变过早返回 null [重复]

LintCode 删除排序链表中的重复元素

删除排序链表中的重复元素(简单)

LintCode 112. 删除排序链表中的重复元素

删除链表中的重复元素:不留&留一个

LintCode 删除排序链表中的重复元素