如何为连接mLab的GraphQL编写数据更新Mutation
解决GraphQL editMovie Mutation数据未更新的问题
我一眼就看出问题出在你editMovie的resolve函数里——你用错了Mongoose的findOneAndUpdate方法!下面给你拆解问题并给出修复方案:
问题根源
你的findOneAndUpdate调用存在三个关键错误:
- 查询条件格式错误:第一个参数应该是查询对象(告诉Mongoose要找哪条文档),而不是直接传入id字符串
- 缺少更新内容:你没有传递要修改的字段和新值,Mongoose根本不知道要更新什么
- 默认返回旧文档:
findOneAndUpdate默认返回更新前的旧数据,所以你看到的还是原来的genre值
修复后的editMovie代码
editMovie: { type: MovieType, args: { id: {type: new GraphQLNonNull(GraphQLString)}, title: {type: GraphQLString}, genre: {type: GraphQLString} }, resolve(parent, args) { // 分离id和要更新的字段 const { id, ...updateData } = args; return Movie.findOneAndUpdate( { _id: id }, // 查询条件:匹配目标文档的_id updateData, // 要更新的字段及新值 { new: true } // 关键选项:返回更新后的新文档 ); } }
代码解释
- 解构参数:用
{ id, ...updateData }把id从参数中分离出来,剩下的title和genre自动组成更新对象,这样即使只传其中一个字段也能正常更新 - 查询条件:
{ _id: id }明确告诉Mongoose要找到_id等于传入id的文档 new: true选项:强制Mongoose返回更新后的最新文档,而不是默认的旧文档
现在再在GraphiQL中执行你的editMovie调用,返回的genre就会变成"Crime"了!
内容的提问来源于stack exchange,提问作者Tylik Stec
相关产品推荐
相关产品推荐

