GraphQL 嵌套文档在突变时返回 null

Posted

技术标签:

【中文标题】GraphQL 嵌套文档在突变时返回 null【英文标题】:GraphQL nested document returns null on mutation 【发布时间】:2021-06-25 02:24:52 【问题描述】:

我将 MongoDB 与 Mongoose 和 GraphQL 一起用于课堂项目。我遇到了一个问题,即 GraphQL 在嵌套文档引用(引用用户模式的 postedBy)中的字段上返回 null。我希望这些字段由引用的对象数据填充,但只返回 ID。

型号

const postSchema = new Schema(
    
        postText: 
            type: String,
            required: 'You need add text to your post',
            minlength: 1,
            maxlength: 10000,
        ,
        createdAt:
            type: Date,
            default: Date.now,
            get: createdAtVal => dateFormat(createdAtVal)
        ,
        postedBy: 
            type: Schema.Types.ObjectId, ref: "User",
            required: true
        ,
        comments: [commentSchema]
    ,
    
        toJSON: 
          virtuals: true,
          getters: true
        ,
    
)

postSchema.virtual('commentCount').get(function() 
    return this.comments.length;
  );

const Post = model('Post', postSchema);
module.exports = Post;

类型定义

type Post 
    _id: ID
    postText: String
    createdAt: String
    postedBy: User
    comments: [Comment]
    commentCount: Int

解析器

addPost: async (parent, args, context) => 
            if (context.user) 
              const post = await Post.create( ...args, postedBy: context.user._id );
              
              await User.findByIdAndUpdate(
                 _id: context.user._id ,
                 $push:  posts: post._id  ,
                 new: true 
              );

              return post;
            
          
            throw new AuthenticationError('You need to be logged in!');
          

我能够成功查询帖子并使用用户的_id、用户名和图像(url)填充引用的字段。当我运行突变时,用户名和图像返回 null。

这是我的突变:

mutation addPost($PostText: String!) 
    addPost(postText: $postText) 
      _id
      postText
      createdAt
      postedBy 
        _id
        username
        image
      
      commentCount
      comments 
        _id
      
    
  

这是它得到的响应:


  "data": 
    "addPost": 
      "_id": "60612871bd89e52ca08d3ea1",
      "postText": "This is an example of a post.",
      "createdAt": "Mar 28th, 2021 at 21:08 pm",
      "postedBy": 
        "_id": "6060a868d856f01738f45185",
        "username": null,
        "image": null
      ,
      "commentCount": 0,
      "comments": []
    
  

我做错了什么?

【问题讨论】:

感谢@minefield_tester。很简单。我曾尝试将填充添加到返回中,但我没有包含 execPopulate。现在完美运行! 【参考方案1】:

由于您只获得 ref 而没有其他数据,我认为您只是忘记填充用户字段。

试试:

return await post.populate('postedBy').execPopulate();

【讨论】:

以上是关于GraphQL 嵌套文档在突变时返回 null的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 突变为嵌套响应返回 null

在 Graphcool / GraphQL 中发布更新突变时如何“更新”数组/嵌套字段?

带有嵌套类型的 Graphql 突变?

突变中的 GraphQL 嵌套数据

使用 AWS Amplify/AppSync 的嵌套 GraphQL 突变

如何处理 GraphQL 中的嵌套输入