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

React/Node.js场景下后端如何向前端返回用户预订航班对象数组

问题原因

你的代码问题核心是异步执行顺序错误:Flight.findById返回Promise属于异步操作,不会阻塞后续代码执行,你在循环发起所有查询请求后直接执行res.send,此时所有数据库查询还未返回结果,自然拿到空数组。另外用var声明的循环变量i存在变量提升问题,就算查询返回,赋值的索引也会错乱。


正确实现方案

推荐用async/await结合Promise.all处理批量异步查询,逻辑清晰且性能更高,代码如下:

// 注意提前引入你项目里定义的User和Flight模型
UserRoutes.get('/Showresflights', async (req, res) => {
  try {
    // 第一步查询用户信息,拿到预订的航班id数组
    const targetUser = await User.findById("61a52b332239b52f7ef5cc68");
    const reservedFlightIds = targetUser.ReservedFlights;
    
    // 第二步批量查询所有航班,Promise.all会等待所有查询请求完成后,统一返回结果数组
    const flights = await Promise.all(
      reservedFlightIds.map(flightId => Flight.findById(flightId))
    );
    
    // 此时拿到的flights就是符合要求的对象数组,直接返回给前端即可
    console.log("flights:", flights);
    res.send(flights);
  } catch (err) {
    // 统一捕获所有环节的异常
    console.error(err);
    res.status(500).send('预订航班查询失败');
  }
});

补充说明

  • 查询返回的result本身就是Mongoose文档对象,直接存入数组返回就是符合要求的格式,不需要额外转换。
  • 如果你不需要Mongoose文档的内置方法,只需要纯JS对象,可以在findById后加.lean(),也就是Flight.findById(flightId).lean(),查询性能更高。

内容的提问来源于stack exchange,提问作者xs0mE1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:00