Node.js调用Instagram API转base64时async await无法正常运行问题
问题根因
convertURLToBase64函数的异步逻辑有误
你当前使用的回调式request.get不支持原生await,函数内部的return data是返回给回调函数本身,不是外层的convertURLToBase64,加上你没有手动包装Promise,这个异步函数最终只会返回undefined,赋值给imageBase64当然是空值。
- 未等待所有异步转码任务完成就返回结果
你用map遍历edges时传入了async函数,得到的updatedEdges本质是一个Promise数组,不是处理完成的edge对象数组,直接返回的话前端拿到的都是未执行完成的Promise,自然没有有效数据。
- 未等待所有异步转码任务完成就返回结果
修复方案
第一步:修改convertURLToBase64,把回调逻辑包装成Promise,确保可以正确返回base64结果。
第二步:在返回updatedEdges前用Promise.all等待所有异步转码任务执行完成,再返回处理后的完整数组。
修复后完整代码
async function convertURLToBase64(url) { console.log('converting URL ' + url + ' to base64'); // 把回调式的request包装成Promise return new Promise((resolve, reject) => { // 注意加encoding: null,否则二进制图片转字符串后再转base64会损坏 request.get(url, { encoding: null }, (error, response, body) => { if (!error && response.statusCode == 200) { console.log('there was no error receiving image'); const data = "data:" + response.headers["content-type"] + ";base64," + Buffer.from(body).toString('base64'); resolve(data); } else { reject(error || new Error('图片请求失败')); } }); }) } async function getHashTaggedPosts(hashtag) { const url = "https://www.instagram.com/explore/tags/" + hashtag + "/?__a=1"; try { const response = await axios.get(url, { headers: { Authorization: AuthStr } }); const edges = response.data.graphql.hashtag.edge_hashtag_to_media.edges; // 先拿到所有异步处理的Promise数组 const updatedEdgesPromises = edges.map(async (edge) => { edge.imageBase64 = await convertURLToBase64(edge.node.thumbnail_src); return edge; }) // 等待所有Promise执行完成,拿到最终处理后的数组 const updatedEdges = await Promise.all(updatedEdgesPromises); console.log('updatedEdges: ', updatedEdges); return updatedEdges; } catch (error) { console.log("error: " + error.message); // 错误场景可根据业务需求返回空数组或者抛出异常 return []; } }
内容的提问来源于stack exchange,提问作者GNG
相关产品推荐
相关产品推荐

