如何在GraphQL中返回POST请求响应:解决resolver提前结束无法获取facepp结果问题
问题根因
你使用的
facepp.post是回调模式的异步方法,当前代码里async resolver没有等待回调执行完成就提前返回了confidence变量,此时回调逻辑还未触发,confidence还处于未赋值的初始状态,所以拿不到返回结果。
修复方案
方案1:使用util.promisify转换回调为Promise(推荐)
Node.js内置的util.promisify可以直接把符合标准回调格式(最后一个参数是(err, res)格式的回调)的方法转为返回Promise的方法,配合async/await使用即可:
const { promisify } = require('util'); // 绑定facepp上下文避免运行时this指向错误 const faceppPost = promisify(facepp.post.bind(facepp)); module.exports = { Mutation: { checkFace: async () => { console.log("Checking....."); const parameters = { image_url1: "link to image 1", image_url2: "link to image 2", }; try { // 等待异步接口返回结果 const res = await faceppPost("/compare", parameters); return res.confidence; } catch (err) { return "There was an error"; } }, }, };
方案2:手动封装Promise
如果不想引入额外工具,也可以手动把回调逻辑封装到Promise里直接返回,async resolver会自动等待Promise完成后再返回最终结果:
module.exports = { Mutation: { checkFace: async () => { console.log("Checking....."); const parameters = { image_url1: "link to image 1", image_url2: "link to image 2", }; return new Promise((resolve) => { facepp.post("/compare", parameters, function (err, res) { if (!err) { resolve(res.confidence); } else { resolve("There was an error"); } }); }) }, }, };
内容的提问来源于stack exchange,提问作者Johndev247
相关产品推荐
相关产品推荐

