fetchFriends: {
type: new GraphQLList(UserType),
args: {
currentId: { type: new GraphQLNonNull(GraphQLID) }
},
resolve: (_, {currentId}) => {
return Promise.resolve()
.then(() => {
User.findById(currentId, (err, users) => {
users.getFriends((err, user) => {
console.log(user);
return user;
});
});
})
}
/* another version what i tried that returns only the initial findById user
resolve: (_, {currentId}) => {
var value = User.findById(currentId, (err, user) => {
new Promise((resolve, reject) => {
user.getFriends((err, user) => {
console.log('fetch: ', user);
err ? reject(err) : resolve(user)
});
})
})
return value;
}*/
},
我有一个graphql解析,我在findById回调中获取User对象。该特定对象调用getFriends,它是mongoose插件(朋友的朋友)的一部分,getFriends回调中的console.log包含终端中的列表,所以我知道getFriends 正在返回正确的数据,但我无法弄清楚如何将值返回到我的React-Native组件。我已经尝试了过去8小时我能想到的一切,并且无法从这个函数中获得返回的值。
答案 0 :(得分:2)
你很接近,但在使用解析器时需要记住几件事:
您的解析器必须返回 一个与您的架构中指定的类型/标量匹配的值或一个将解析为该值的Promise。
Mongoose操作can return a promises,你应该利用它们的这个功能,而不是试图在Promises中包装回调,因为这很容易弄乱
至少在此上下文中返回回调内的语句)实际上并没有做任何事情。另一方面,返回then
内的语句,确定承诺将解决的内容(或链中接下来要调用的承诺)。
我想你的解析器需要看起来像这样:
resolve (_, {currentId}) => {
// calling exec() on the query turns it into a promise
return User.findById(currentId).exec()
// the value the promise resolves to is accessible in the "then" method
.then(user => {
// should make sure user is not null here, something like:
if (!user) return Promise.reject(new Error('no user found with that id'))
// we want the value returned by another async method, getFriends, so
// wrap that call in a promise, and return the promise
return new Promise((resolve, reject) => {
user.getFriends((error, friends) => {
if (error) reject(error)
resolve(friends)
})
})
})
}