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:并发请求存数组的异常排查
看你贴的代码片段,发现几个可能导致异常的点,咱们一步步梳理:
- 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`; - 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`; - 异步请求的处理方式:如果用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); // 捕获任意一个请求的错误 } } - 缺失错误处理:你的代码里没有任何错误捕获逻辑,若其中一个请求失败,整个流程会卡住或返回undefined,一定要加上错误处理分支。
内容的提问来源于stack exchange,提问作者Alex Ironside
相关产品推荐
相关产品推荐

