Node.js嵌套map函数Promise无法resolve,API调用返回电影对象数组问题
问题根因
- 使用
map遍历调用异步函数时,返回的是Promise数组,单纯await数组无法触发批量Promise执行,必须搭配Promise.all完成全部异步任务的等待 - 已经一次性查询了全量心愿单数据,不需要循环通过_id二次查询数据库,属于冗余操作
- 原空校验逻辑错误:
Wishlist.find无匹配数据时返回空数组而非null,原有空判断永远不会触发
修复后完整代码
const axios = require('axios'); // 请确保已正确引入Wishlist模型 module.exports = { fetchAll: async (req, res, next) => { try { const wishlist = await Wishlist.find({}); // 修复空校验逻辑 if (wishlist.length === 0) { return res.status(404).json({ success: false, msg: 'No Movies Found in Wishlist', wishlist: [] }) } // 直接从已查询的心愿单数据提取movieId调用接口,搭配Promise.all等待所有请求完成 const wishlistItems = await Promise.all( wishlist.map(async (item) => { const apiRes = await axios.get(`https://api.tvmaze.com/shows/${item.movieId}`); return apiRes.data; }) ); return res.status(200).json({ length: wishlistItems.length, success: true, msg: 'All Movies in Wishlist Fetched', wishlist: wishlistItems }) } catch (err) { console.log(err); next(err); } }, // 其他原有方法 }
可选优化(防止单条接口请求失败影响整体返回)
如果需要兼容部分电影详情拉取失败的场景,可以在单个请求处增加异常捕获:
const wishlistItems = await Promise.all( wishlist.map(async (item) => { try { const apiRes = await axios.get(`https://api.tvmaze.com/shows/${item.movieId}`); return apiRes.data; } catch (e) { // 可自定义失败时的返回结构,也可以过滤掉失败条目,按需调整即可 return { movieId: item.movieId, msg: '当前电影详情获取失败' } } }) );
内容的提问来源于stack exchange,提问作者Nzadibe
相关产品推荐
相关产品推荐

