【问题标题】:mongoose findByIdAndUpdate returns null on unmodified model data in graphql [duplicate]mongoose findByIdAndUpdate 在 graphql 中未修改的模型数据上返回 null [重复]
【发布时间】:2018-11-03 21:47:47
【问题描述】:

我在尝试使用 graphql.findByIdAndUpdate 更新 mongoose 架构时遇到问题。

每当我尝试更新文档时,新数据都会正确更新,但未修改的数据会变为空。

所以如果我在 graphiql 中运行它:

mutation {
  updateProfile(id: "5b05b4cfd53486377061eab3", name: "dave") {
    id
    name
    age
    interests
  }
}

它返回这个对象:

{
  "data": {
    "updateProfile": {
      "id": "5b05b4cfd53486377061eab3",
      "name": "dave",
      "age": null,
      "interests": null
    }
  }
}

新数据已更新到文档,但旧数据已被删除。

这个想法是能够只更新文档的一个部分,而其余部分不会变成 null。

负责更新的GraphQL代码:

updateProfile: {
            type: profileType,
            args: {
                id:        { type: new GraphQLNonNull(GraphQLID) },
                name:      { type: GraphQLString },
                age:       { type: GraphQLString },
                interests: { type: GraphQLString },
            },
            resolve(parent, args) {
                return Profile.findByIdAndUpdate(args.id, {
                        name:      args.name,
                        age:       args.age,
                        interests: args.interests
                }, {new: true}, (err, Profile) => {
                    if (err) {
                        return res.status(500).send(err);
                    }
                    return;
                }); 
            }
        }

这是架构:

const profileSchema = mongoose.Schema({
    name:      String,
    age:       String,
    interests: String,
});

感谢任何和所有帮助,在此先感谢!

【问题讨论】:

  • 检查你的Profile...console.log(Profile)
  • Mongoose 方法仅在您省略回调时才返回承诺。有关详细信息,请参阅this answer 中的常见场景 #6。

标签: node.js mongoose graphql


【解决方案1】:

这可以像下面的例子一样解决。

之前您是通过 args 参数的值单独设置或更新字段。

您需要像下面的代码一样直接在“findByIdAndUpdate(args.id,args)”中传递 args 参数

它将仅更新请求中的字段。

在突变中:

   updateProfile: {
        type: profileType,
        args: {
            id:        { type: new GraphQLNonNull(GraphQLID) },
            name:      { type: GraphQLString },
            age:       { type: GraphQLString },
            interests: { type: GraphQLString },
        },
        resolve(parent, args) {
            return Profile.findByIdAndUpdate(args.id,args, (err, Profile)=> {
                 if(err) {
                     return res.status(500).send(err);
                 }
                 return
            }) 
        }
    }

我希望这对其他人有用,谢谢。

【讨论】:

    猜你喜欢
    • 2019-03-08
    • 2017-03-13
    • 2020-02-02
    • 1970-01-01
    • 2019-06-24
    • 2019-06-28
    • 2023-04-08
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多