Node.js接口开发Res.send返回空数组,最后then中customizeObj为空求助
问题原因
你遇到的问题核心是Array.prototype.forEach不支持异步等待逻辑:
forEach传入异步函数时,只会同步触发所有异步任务,不会等待任何异步任务执行完成就会继续执行后续代码。
你的代码里,forEach后的打印、后续then回调执行时,所有Event.findById的数据库查询还没返回结果,自然还没执行到customizeObj.push逻辑,所以拿到的是空数组。你在forEach内部的打印能看到内容,是因为那是异步查询完成后才执行的逻辑,执行时间远晚于外层的打印操作。
修复方案
将forEach替换为map生成Promise数组,再用Promise.all等待所有异步查询完成,就能拿到完整的组装结果。推荐直接用async/await简化Promise链写法,可读性更高:
userRouter.get("/getusers", async (req, apiRes) => { try { // 直接await拿到用户查询结果,不需要额外变量中转 const users = await User.find(); // Promise.all等待所有用户关联的事件查询完成 const customizeObj = await Promise.all( users.map(async (user) => { const event = await Event.findById(user.eventID); const year = event.date.getFullYear(); // 用padStart补零比三元判断更简洁 const month = String(event.date.getMonth() + 1).padStart(2, '0'); const day = String(event.date.getDate()).padStart(2, '0'); return { firstName: user.firstName, lastName: user.lastName, phoneNumber: user.phoneNumber, zipCode: user.zipCode, type: event.type, location: event.location, date: new Date(`${year}-${month}-${day}`), }; }) ); apiRes.send(customizeObj); } catch (err) { console.log(err); // 出错时返回正确的状态码和提示 apiRes.status(500).send({ error: '数据查询失败' }); } });
额外优化点
Promise.all会并行执行所有事件查询,相比串行查询性能更高- 不需要声明空数组逐个push,
Promise.all会自动把所有异步函数的返回值组装成数组 - 统一用
try/catch捕获所有异步错误,避免接口无响应
内容的提问来源于stack exchange,提问作者Captain Alpha
相关产品推荐
相关产品推荐

