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

API返回数据为undefined对象,异步HTTPS多请求存数组问题咨询

我来帮你逐个排查这两个问题哈:

问题1:API返回undefined的常见原因

整理了几个最可能触发这个问题的场景,你可以对照排查:

  • 请求本身失败:比如网络波动、请求超时,或者API返回4xx(参数错误、权限不足)、5xx(服务器内部错误)这类非成功状态码,若代码没处理错误分支,就可能拿到undefined。
  • 请求参数无效:比如你的KEY过期/不正确、LOOKUP的网站格式有问题(比如漏了域名后缀、包含特殊字符),API可能返回空响应或错误信息,但代码直接提取数据时就会得到undefined。
  • 响应处理逻辑出错:比如漏了JSON.parse()解析API返回的JSON字符串,或者试图访问响应里不存在的属性(比如想取resp.data.result但API返回结构里根本没有data字段)。
  • 跨域拦截(前端请求场景):浏览器同源策略会拦截跨域请求,导致完全拿不到响应,最终结果就是undefined。
问题2:并发请求存数组的异常排查

看你贴的代码片段,发现几个可能导致异常的点,咱们一步步梳理:

  1. URL转义字符错误:你写的&是HTML转义字符,实际请求时要换成普通的&,不然API会把&LOOKUP当成一个参数名,识别不了真正的LOOKUP参数,自然返回错误或空数据。
    修正后的URL示例:
    let builtWithCall = `https://api.builtwith.com/free1/api.json?KEY=key&LOOKUP=${website}`;
    let pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${website}&strategy=mobile&key=key`;
    
  2. URL拼接的潜在问题:pagespeedCall里的url=https://${website},如果用户输入的website已经带了https://或http://,就会变成url=https://https://xxx.com,导致Pagespeed API无法识别正确URL,返回错误。建议先清理输入:
    const cleanWebsite = website.replace(/^https?:\/\//, '');
    let pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${cleanWebsite}&strategy=mobile&key=key`;
    
  3. 异步请求的处理方式:如果用Node.js的https模块发起请求,直接写回调容易出现异步顺序问题,建议用Promise封装请求,再用Promise.all并发处理两个请求,确保都完成后再存入数组:
    function fetchData(url) {
      return new Promise((resolve, reject) => {
        https.get(url, (resp) => {
          let data = '';
          resp.on('data', (chunk) => {
            data += chunk;
          });
          resp.on('end', () => {
            try {
              const result = JSON.parse(data);
              resolve(result);
            } catch (err) {
              reject(err); // 处理JSON解析错误
            }
          });
        }).on('error', (err) => {
          reject(err); // 处理请求错误
        });
      });
    }
    
    // 在async函数里调用
    async function getReports() {
      try {
        const [builtWithData, pagespeedData] = await Promise.all([
          fetchData(builtWithCall),
          fetchData(pagespeedCall)
        ]);
        const reports = [builtWithData, pagespeedData];
        // 后续处理数组的逻辑
      } catch (err) {
        console.error('请求出错:', err); // 捕获任意一个请求的错误
      }
    }
    
  4. 缺失错误处理:你的代码里没有任何错误捕获逻辑,若其中一个请求失败,整个流程会卡住或返回undefined,一定要加上错误处理分支。

内容的提问来源于stack exchange,提问作者Alex Ironside

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:08:12