GraphQL Apollo Server resolver调用POST请求提前返回问题如何解决
问题原因
你当前使用回调模式调用facepp.post接口,JavaScript的事件循环机制不会等待回调函数执行完成再执行后续的return语句,因此返回时confidence还未被接口返回值赋值,只能拿到初始的undefined。
同时你已经为resolver声明了async关键字,只需要将回调调用转为Promise模式搭配await即可解决问题。
解决方案
将facepp.post的回调调用封装为Promise,await得到结果后再返回:
module.exports = { Mutation: { checkFace: async () => { console.log("Checking....."); const parameters = { image_url1: "link to image 1", image_url2: "link to image 2", }; // 封装回调为Promise const confidence = await new Promise((resolve, reject) => { facepp.post("/compare", parameters, function (err, res) { if (!err) { resolve(res.confidence); } else { console.log(err); reject(err); } }); }) return confidence }, }, };
额外说明
- 如果
facepp官方SDK已经支持Promise式调用,你可以直接省去手动封装的步骤,直接用await facepp.post(...)的写法获取返回值 - 上述代码中如果接口调用失败会直接抛出错误,Apollo Server会自动将错误信息返回给客户端,你也可以根据业务需求在错误捕获逻辑中返回自定义的错误格式
内容的提问来源于stack exchange,提问作者Johndev247
相关产品推荐
相关产品推荐

