Expo React Native中fetch调用response.json()报Unexpected end of input错误
报错原因
- 核心问题是你在fetch配置中添加了
mode: 'no-cors'参数:该模式是浏览器环境的特殊配置,用于发起不需要获取响应内容的跨域请求,此模式下返回的响应为不透明类型,响应体完全无法读取,调用response.json()时相当于解析空内容,自然触发Unexpected end of input语法错误。 - Node.js环境没有浏览器的同源策略限制,也不识别
no-cors参数,所以同一段代码可以正常运行。
解决方案
- 首先删除fetch配置中的
mode: 'no-cors'行,React Native(Expo)环境本身不存在浏览器的同源策略限制,完全不需要添加该参数,添加反而会导致响应体无法读取。 - 修正后的请求代码可以增加异常捕获逻辑,方便定位后续可能出现的后端返回格式问题,参考代码如下:
async function postData (url, data) { const params = { method: 'POST', headers:{ Accept: 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(data) }; let response = await fetch(url, params); try { // 先确认响应状态正常再解析 if (!response.ok) { throw new Error(`请求异常,状态码:${response.status}`); } const responseJson = await response.json(); // 原代码此处返回了response而非解析后的json,可根据你的需求调整 return responseJson; } catch (err) { // 解析失败时打印原始响应内容排查问题 const rawText = await response.text(); console.error('JSON解析失败,原始响应内容:', rawText); throw err; } }
- 若删除
no-cors后Web端调试时出现跨域报错,仅需要后端服务配置CORS规则允许前端请求即可,Expo原生端运行不会存在该问题。
额外注意
你原代码中postData函数最后返回的是未解析的response对象,调用postData的then回调中拿到的也会是原始响应对象,而非解析后的JSON数据,可根据你的业务需求调整返回值。
内容的提问来源于stack exchange,提问作者Nano
相关产品推荐
相关产品推荐

