You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 23:09:02