修复TypeError: Cannot read properties of undefined (reading 'results')问题
问题根源
getRatios函数已成功获取API返回的storage数据,但未正确返回处理后的数据,导致调用方接收的click_ratio_json为undefined,进而触发TypeError: Cannot read properties of undefined (reading 'results')错误。
解决方案:修正getRatios函数
确保函数正确返回仅包含results中period和ratio字段的数据,同时增加异常处理避免额外错误。以下是修正后的代码:
错误版本示例(供对比)
async function getRatios(keyword) { const response = await axios.get('naver-api-endpoint', { params: { keyword } }); const storage = response.data; // 错误:仅执行转换但未返回结果 storage.results.map(item => ({ period: item.period, ratio: item.ratio })); }
修正后的函数
async function getRatios(keyword) { try { // 调用Naver API(替换为实际接口地址,补充认证头) const response = await axios.get('https://openapi.naver.com/v1/datalab/search', { headers: { 'X-Naver-Client-Id': '你的客户端ID', 'X-Naver-Client-Secret': '你的客户端密钥' }, params: { keyword: keyword, // 补充API要求的其他参数,如时间范围等 } }); const storage = response.data; // 校验数据结构,避免空值异常 if (!storage || !storage.results) { throw new Error("API返回数据格式异常,缺少results字段"); } // 提取目标字段并返回 return storage.results.map(item => ({ period: item.period, ratio: item.ratio })); } catch (error) { console.error("获取数据失败:", error.message); throw error; // 向上抛出错误,让调用方处理 } }
关键修改点
- 添加return语句:原函数仅执行了map转换但未返回结果,修正后返回处理后的数组。
- 增加数据校验:先判断
storage和storage.results是否存在,避免API返回结构异常引发新错误。 - 异常捕获:用try/catch包裹API调用逻辑,捕获请求错误并向上抛出,方便调用方统一处理。
终端输入关键词的完整流程示例
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('请输入关键词:', async (keyword) => { try { const click_ratio_json = await getRatios(keyword); // 输出处理后的数据 console.log('\n处理后的点击比率数据:'); click_ratio_json.forEach(item => { console.log(`时间:${item.period},比率:${item.ratio}`); }); // 示例:计算平均比率 if (click_ratio_json.length > 0) { const total = click_ratio_json.reduce((sum, item) => sum + parseFloat(item.ratio), 0); const avgRatio = (total / click_ratio_json.length).toFixed(2); console.log(`\n关键词「${keyword}」的平均点击比率:${avgRatio}`); } } catch (error) { console.error('\n操作失败:', error.message); } finally { rl.close(); } });
内容的提问来源于stack exchange,提问作者HEO.JY
相关产品推荐
相关产品推荐

