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

如何在嵌套函数中将数据推入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:10:43