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
相关产品推荐
相关产品推荐

