app.js中fetch请求偶现JSON解析报错:位置0意外出现token C
偶发JSON解析报错的根因与修复
报错本质
SyntaxError: Unexpected token C in JSON at position 0 是response.json()解析阶段抛出的语法错误:合法JSON响应的起始字符只会是{或[,现在解析的内容从第0位就出现了大写字母C,说明接口根本没有返回预期的标准JSON结构。
结合“偶发触发、无稳定复现规律”的特征,常见触发场景有三类:
- RapidAPI侧触发接口限流、上游数据源连接异常时,不会返回标准化JSON格式的错误信息,而是直接返回纯文本提示,比如Could not reach upstream data source、Invalid country parameter,这类文本的首字母恰好为C,直接引发解析失败
- 拼接URL时未对
user_country参数做URI编码,当传入的国家名称带空格、特殊符号时,接口会返回纯文本格式的校验错误,破坏JSON返回的预期结构 - 网络波动导致响应内容截断,拿到的不完整片段恰好以C字符开头
修复实现
不要跳过响应校验直接执行JSON解析,需补充两类防御逻辑:
- 对入参做URI编码,避免特殊字符引发的请求异常
- 先校验响应的内容类型,确认是JSON格式后再执行解析;遇到非JSON返回时,读取原始响应文本抛出可溯源的错误
参考修复后的代码:
function fetchData(user_country) { // 对拼接参数做URI编码,避免特殊字符干扰请求 const encodedCountry = encodeURIComponent(user_country) fetch(`https://covid19-monitor-pro.p.rapidapi.com/coronavirus/cases_by_days_by_country.php?country=${encodedCountry}`, { "method": "GET", "headers": { "x-rapidapi-key": "0eb507ba94mshbdcee33e20f63e2p1f00eajsn1967cf2bd741", "x-rapidapi-host": "covid19-monitor-pro.p.rapidapi.com" } }) .then(async response => { // 校验响应内容类型,避免非JSON内容直接解析报错 const contentType = response.headers.get('content-type') if (!contentType?.includes('application/json')) { const rawResponse = await response.text() throw new Error(`接口返回非JSON内容,原始响应:${rawResponse},HTTP状态码:${response.status}`) } return response.json(); })
注意:示例代码中硬编码的RapidAPI密钥不要直接暴露在前端生产代码中,避免被恶意盗用消耗API额度
内容的提问来源于stack exchange,提问作者Jaseem Mohammed
相关产品推荐
相关产品推荐

