【发布时间】:2018-01-28 23:36:36
【问题描述】:
当我运行类似的突变时,我遇到了一个奇怪的返回结果。我只是在学习这个堆栈,我用 mongoose 作为我的数据库层来实现 mongodb。
我有两个简单的突变。一个人创建一个用户并将其添加到数据库中,也就是注册。另一个显然是在创建初始用户对象后添加了个人资料图片。
两个解析器都返回完整的用户对象,这对于更新 ui、商店等非常有用,我正计划实施订阅,因此获取新数据很重要。
我正在使用 graphiql 解决问题,但遇到了一个奇怪的问题。即使图像 url 已保存到数据库,我的更新解析器仍返回 null。注册解析器正在返回所有用户字段。
在控制台记录解析器中的返回对象时,两个函数都返回一个完整的用户对象。
当我试图使返回对象不可为空时,我会得到错误不能为更新解析器的不可空返回 null。
我的解析器最初使用带有回调的 findOneAndUpdate,该回调实际上返回了用户对象。是的,我仍然是空的。很奇怪。
我将解析器更改为更手动的方法。我通过传入用户 ID 的 findOne 查找现有用户,然后明确地说 user.profilePic = "url of pic" 并调用整个用户对象的保存并在回调中返回用户对象。和繁荣,这行得通!
那是什么原因造成的呢?我最初的感觉是这与时间有关,也就是不等待回调....我真的不明白为什么我的第一种方法不起作用而我的第二种方法不起作用。我将为两者附上代码,也许有人对时间有更深入的了解,或者可能异步函数可以加入。也许我需要将我的风格从回调更新为承诺或异步等待。
//this one doesnt work
addProfilePic: (root, { input }, context) => {
let update = { profilePic: input.profilePic };
let query = { id: input.id };
let options = { new: true, upsert: true};
let callback = ((err, user) => {
if(err) console.log(err.message);
return user;
})
return updatedUser = User.findOneAndUpdate(query, update, options, callback)
}
//this one works, but returns old user object to client...
//so really, no, it doesn't work
addProfilePic: (root, { input }, context) => {
return User.findOne({id: input.id}, ((err,user) => {
if(err)console.log(err);
if(user){
user.profilePic = input.profilePic;
user.save((err) => {
if(err)console.log(err);
console.log(user);
return user;
})
}
})
})
注意:传入上下文,当我实际实现时,我将从上下文中获取 id,其中包含登录时的用户。 注意:这些很快就会成为很酷的工具,但还有很多东西要学,尤其是对于有 3 个月总编码经验的人...即我...
【问题讨论】:
标签: mongodb mongoose graphql graphql-js