Express调用公开API时JSON解析报错,JSON已验证有效
Express调用外部API解析JSON时出现JSON解析错误的解决方法
问题原因
你遇到的「Unexpected end of JSON input」和「Unexpected token , in JSON at position X」错误,核心原因是**https.get的data事件是分块触发的**:外部API返回的响应数据会被拆分成多个片段,每次data回调拿到的d只是其中一段,不是完整的JSON字符串。直接对单片段做JSON.parse,自然会因为数据不完整导致解析失败——哪怕最终拼接后的完整JSON是有效的。
修复方案
需要先把所有分块数据拼接起来,等到end事件触发(表示所有数据接收完成)后,再执行JSON解析。修改你的characters路由代码如下:
const express = require('express'); const https = require('https'); const router = express.Router(); const api = 'https://www.cheapshark.com/api/1.0/games?title=batman&steamAppID=35140&limit=60&exact=0'; router.get("/", function(req, res) { https.get(api, (response) => { console.log(response.statusCode); // 初始化变量存储完整响应数据 let rawData = ''; // 分块接收数据并拼接 response.on('data', (chunk) => { rawData += chunk; }); // 所有数据接收完成后执行解析 response.on('end', () => { try { const data = JSON.parse(rawData); console.log(data); res.send(data); } catch (err) { console.error('JSON解析失败:', err); res.status(500).send('数据解析错误'); } }); // 处理请求过程中的错误 response.on('error', (err) => { console.error('请求外部API失败:', err); res.status(500).send('请求外部数据失败'); }); }) }) module.exports = router;
额外优化建议
- 增加状态码校验:如果外部API返回非200状态码(如404、500),可提前终止流程,避免解析无效数据
- 指定编码格式:如果外部API返回非UTF-8编码的数据,需通过
response.setEncoding('utf8')明确指定编码,避免乱码问题
内容的提问来源于stack exchange,提问作者Tan Duong
相关产品推荐
相关产品推荐

