如何在嵌套函数中将数据推入Object?Node.js多API数据存储问题
问题分析与解决方案
核心问题
你的代码里http.request是异步操作,map循环会同步发起所有请求,但请求的响应还没返回时,你就已经执行了res.send(success),导致返回的success.result是空的或者数据不完整。另外execution_count是同步累加的,循环跑完它就等于count了,完全没等异步请求结束。
修复后的代码
const http = require('https'); // 把单个HTTP请求封装成Promise function fetchIpData(ip) { return new Promise((resolve, reject) => { const options = { method: 'GET', hostname: 'www.test.com', port: null, path: `/api/v3/object/${ip}`, headers: { accept: 'application/json', 'x-apikey': '###########' } }; const request = http.request(options, (response) => { const chunks = []; response.on('data', (chunk) => chunks.push(chunk)); response.on('end', () => { try { const body = Buffer.concat(chunks); const data = JSON.parse(body.toString()); resolve(data); } catch (err) { reject(err); } }); }); request.on('error', reject); request.end(); }); } exports.ip = async (req, res) => { try { const ip = req.body.ip; const ip_list = ip.trim().split(' '); const success = { result: [] }; const name = 'lenin royal'; // 用Promise.all等待所有请求完成 const allResults = await Promise.all(ip_list.map(fetchIpData)); success.result = allResults; res.send(success); } catch (err) { // 处理错误,比如返回500状态码 res.status(500).send({ error: err.message }); } };
代码说明
- 把单个IP的请求逻辑封装成
fetchIpData函数,返回Promise,成功时resolve返回的数据,失败时reject错误。 - 在
exports.ip里用Promise.all等待所有IP请求完成,拿到所有结果后直接赋值给success.result,再返回响应。 - 增加了错误处理,避免单个请求失败导致整个接口崩溃。
内容的提问来源于stack exchange,提问作者lenin 0x321
相关产品推荐
相关产品推荐

