Node.js调用SWAPI无法筛选指定名称行星数据问题咨询
解决SWAPI行星数据获取与解析的常见问题
看起来你在用Node.js对接SWAPI时,碰到了JSON解析和行星筛选的麻烦,我来帮你梳理下常见的坑和解决办法:
1. 核心问题:未完整接收响应就解析JSON
Node.js原生HTTP请求是流模式,如果你在data事件触发时直接尝试解析JSON,大概率只拿到了部分数据,自然会抛出解析错误。
正确的原生HTTP处理方式
要等所有数据接收完成后再解析:
const http = require('http'); function getTargetPlanet(planetName) { http.get('https://swapi.co/api/planets/?format=json', (res) => { let rawData = ''; // 拼接所有数据块 res.on('data', (chunk) => { rawData += chunk; }); // 数据接收完毕后处理 res.on('end', () => { try { const planetsData = JSON.parse(rawData); // 不区分大小写筛选行星 const target = planetsData.results.find( planet => planet.name.toLowerCase() === planetName.toLowerCase() ); if (target) { console.log('找到目标行星:', target); // 这里写你的数据库存储逻辑 } else { console.log('当前页未找到该行星'); } } catch (err) { console.error('JSON解析失败:', err.message); } }); }).on('error', (err) => { console.error('请求SWAPI失败:', err.message); }); } // 调用示例 getTargetPlanet('Tatooine');
2. 用第三方库简化处理(推荐)
原生HTTP模块太繁琐,用axios或node-fetch能自动处理JSON解析,减少出错概率:
Axios实现示例
先安装依赖:
npm install axios
然后编写业务逻辑:
const axios = require('axios'); async function checkAndSavePlanet(planetName) { // 第一步:检查数据库是否存在该行星(这里用模拟函数代替) const existsInDB = await checkPlanetInDB(planetName); if (existsInDB) { console.log('行星已在数据库中'); return; } try { // 从SWAPI获取行星列表 const res = await axios.get('https://swapi.co/api/planets/?format=json'); const targetPlanet = res.data.results.find( p => p.name.toLowerCase() === planetName.toLowerCase() ); if (targetPlanet) { console.log('获取到行星数据:', targetPlanet); // 写入数据库 await savePlanetToDB(targetPlanet); } else { console.log('SWAPI当前页未找到该行星'); } } catch (err) { console.error('请求或解析出错:', err); } } // 模拟数据库操作函数 async function checkPlanetInDB(name) { // 替换成你的数据库查询逻辑 return false; } async function savePlanetToDB(planet) { // 替换成你的数据库写入逻辑 console.log('行星已保存到数据库'); } // 调用示例 checkAndSavePlanet('Alderaan');
3. 别忘了处理SWAPI的分页
SWAPI默认每页返回10条行星数据,如果目标行星不在第一页,上面的代码会找不到它。需要遍历所有分页:
const axios = require('axios'); async function fetchAllPlanets() { let allPlanets = []; let nextPageUrl = 'https://swapi.co/api/planets/?format=json'; while (nextPageUrl) { const res = await axios.get(nextPageUrl); allPlanets = [...allPlanets, ...res.data.results]; nextPageUrl = res.data.next; // 没有下一页时为null } return allPlanets; } async function findPlanetAcrossPages(planetName) { const allPlanets = await fetchAllPlanets(); return allPlanets.find(p => p.name.toLowerCase() === planetName.toLowerCase()); } // 调用示例 findPlanetAcrossPages('Coruscant').then(planet => { planet ? console.log('找到行星:', planet) : console.log('未找到目标行星'); });
4. 快速排查错误的技巧
如果还是报错,先打印响应的原始内容确认问题:
res.on('end', () => { console.log('响应数据类型:', typeof rawData); console.log('响应原始内容:', rawData); // 再尝试解析JSON });
这样能快速判断是响应内容非标准JSON,还是编码、请求本身的问题。
内容的提问来源于stack exchange,提问作者Sadixu
相关产品推荐
相关产品推荐

