Node.js请求https接口获取数据时Response出现鬼符、字段异常问题
问题根源
- API返回JSON存在键名异常:部分
ship_name键被插入大量空白字符,变为sh ip_name,解析后无法通过标准ship_name字段读取属性,导致取值为undefined,两次对比必然不相等,触发异常打印。 - 未做属性兼容:直接对
ship_name做全等对比,没有处理异常键、前后空格等情况,容错率极低。 - 引用传递隐患:直接将解析后的
ship对象引用存入缓存,若后续对象属性发生变更会直接影响历史值的对比结果。
修复方案
1. 新增名称兼容读取方法
统一处理异常键名,自动过滤键名和值的空白字符:
function getValidShipName(ship) { // 优先读取标准键 if (typeof ship.ship_name === 'string') { return ship.ship_name.trim(); } // 遍历所有键匹配异常变形的ship_name for (const key of Object.keys(ship)) { if (key.replace(/\s+/g, '') === 'ship_name') { return ship[key].trim(); } } // 兜底返回空字符串,避免undefined参与对比 return ''; }
2. 修改对比逻辑
使用兼容方法读取名称后再做对比,同时过滤空值的异常情况:
checkChange(oldShip, newShip) { const oldName = getValidShipName(oldShip); const newName = getValidShipName(newShip); // 仅当两个名称都有效且不相同时才打印 if (oldName && newName && oldName !== newName) { console.log(`${oldName} | ${newName}`); } }
3. 优化缓存存储逻辑
避免引用传递问题,仅存储需要的核心属性到缓存:
// 替换原代码中 shipData[ship.hex_code] = ship shipData[ship.hex_code] = { ship_name: getValidShipName(ship), hex_code: ship.hex_code, score: ship.score, rank: ship.rank };
内容的提问来源于stack exchange,提问作者Gravity Assist
相关产品推荐
相关产品推荐

