Node.js使用forEach处理异步请求后res.json返回空数组如何解决
问题根源
Array.prototype.forEach本身不是异步函数,不会返回Promise对象,所以你写的await data.forEach(...)实际没有等待任何异步操作完成,代码会直接走到res.json(array)这一步,此时所有Twilio的异步请求还没有返回结果,自然数组是空的。- 你在
.then里能打印到数据,是因为回调是在异步请求完成后才执行,这时候res.json早就已经执行结束了。
修复方案
把遍历逻辑改成用map生成所有请求的Promise数组,再用Promise.all等待所有请求执行完成,统一处理结果:
const listParticipants = async (req, res) => { try { const { subActServiceSid, subActAuthToken, convoServiceSid} = req.user const subClient = require('twilio')(subActServiceSid, subActAuthToken) const { data } = req.body // 用map生成所有异步请求的Promise数组 const promiseArr = data.map(convo => subClient.conversations.services(convoServiceSid) .conversations(convo) .participants .list({limit: 20}) // 直接返回需要的结构,不用额外push到外部数组 .then(participants => ({ "sid": participants.sid })) ) // 等待所有请求完成,拿到所有结果 const resultArr = await Promise.all(promiseArr) res.json(resultArr) } catch (err) { // 错误捕获,避免请求出错时接口挂起 res.status(500).json({ error: err.message }) } }
如果你的场景需要串行请求避免触发Twilio的频率限制,可以换成for of循环的写法:
const listParticipants = async (req, res) => { try { const { subActServiceSid, subActAuthToken, convoServiceSid} = req.user const subClient = require('twilio')(subActServiceSid, subActAuthToken) const { data } = req.body const resultArr = [] for (const convo of data) { const participants = await subClient.conversations.services(convoServiceSid) .conversations(convo) .participants .list({limit: 20}) resultArr.push({"sid": participants.sid}) } res.json(resultArr) } catch (err) { res.status(500).json({ error: err.message }) } }
内容的提问来源于stack exchange,提问作者AmandaConda
相关产品推荐
相关产品推荐

