我正在构建GraphQL API,我需要访问附近的用户位置。我使用了node-georedis lib(https://github.com/arjunmehta/node-georedis),它接受回调以获取返回数据。
我可以验证回调确实是在返回正确信息的情况下调用的,但是当我尝试在GraphQL查询解析器中返回该数据时,它是未定义的。我认为这是一个异步问题,但我在搜索stackoverflow之后尝试了各种基于Promise,等待/异步,甚至是同步实现。
也许我忽略了范围问题?任何想法都将不胜感激!
Query: {
nearbyUsers: async (
_,
{ input }: GQL.INearbyUsersOnQueryArguments
) => {
return nearbyUsers(input.latitude, input.longitude);
}
},
export const nearbyUsers = (latitude: Number, longitude: Number) => {
let users: any[] = [];
georedis.nearby({ latitude, longitude }, 5000, async (err: any, userIDS: any) => {
if (err) {
console.log(err);
} else {
users = await User.findByIds(userIDS);
console.log(users); // Does indeed print proper Users
}
});
return users; // Value is [] when returning
};
答案 0 :(得分:1)
export const nearbyUsers = (latitude: Number, longitude: Number) => {
return new Promise((resolve, reject) => {
georedis.nearby({ latitude, longitude }, 5000, (err: any, userIDS: any) => {
err ? reject(err) : resolve(userIDS);
});
}).then(async (userIDS) => {
return User.findByIds(userIDS as string[]);
});
};
答案 1 :(得分:0)
在此处添加来自andrewwx10的答案的重要之处在于,当调用'georedis.nearby'时,该函数本身具有回调,并且graphql不会等到完成回调之后再继续执行最后的“返回用户”; '。这就是解析器返回空的原因。
将等待代码放入回调本身中,仅有助于控制回调本身中的流,但此处不包括父级/顶级代码流中的>
由于这个原因,必须将 georedis。的发票包装到Promise中,以便解析器不会在调用之后继续进行。