React Native跳转详情页遇JSON Parse error: Unexpected EOF问题求助
看起来你遇到的这个JSON解析错误,本质是服务器返回的响应不是有效的JSON格式——虽然Postman测试正常,但App里的请求可能和Postman存在差异,导致服务器返回了空内容、错误页面或者非JSON文本。我帮你梳理几个排查和解决的方向:
1. 先确认请求参数是否正确传递
你的API是leave/{staff_id},如果staff_id为空或者undefined,请求URL就会变成leave/,服务器大概率会返回非JSON的错误响应(比如404页面),直接解析JSON就会报EOF错误。
在发起fetch前先打印参数验证:
var staff_id = this.props.navigation.getParam('id'); console.log('传递过来的staff_id:', staff_id); // 看看是不是你预期的数值 this.setState({ staff_id: staff_id }); // 再打印完整请求URL const requestUrl = FetchURL.get_baseURL() + "leave/" + staff_id; console.log('完整请求URL:', requestUrl);
如果staff_id是空,那就要检查首页跳转时的参数传递是否正确——比如首页跳转代码是不是navigation.navigate('你的详情页', { id: 正确的staffId }),确保staffId不是空值。
2. 查看服务器返回的原始响应内容
别直接调用response.json(),先获取响应的原始文本,看看服务器到底返回了什么:
fetch(requestUrl, { method: 'GET', headers: { 'Authorization': 'Bearer '+ token, } }) .then(response => { console.log('响应状态码:', response.status); // 比如200是正常,401是权限问题,404是路径错 return response.text(); // 先拿文本,不直接转JSON }) .then((responseText) => { console.log('服务器原始响应:', responseText); // 这里能看到真实返回内容 try { const json = JSON.parse(responseText); alert(json) if (json.error) { alert(json.error); } else { this.setState({ staffLeave: json, isLoading: false }); } } catch (parseErr) { console.log('JSON解析失败原因:', parseErr); alert('服务器返回内容格式错误:' + responseText); } }) .catch((err) => { console.log('请求异常:', err) alert(err) })
比如如果返回的是HTML错误页面(比如401未授权、500服务器错误),或者空字符串,那就能直接找到问题根源。
3. 验证Token的有效性和格式
虽然Postman测试正常,但App里从AsyncStorage获取的token可能过期、为空或者格式错误:
const token = await AsyncStorage.getItem('token'); console.log('获取到的Token:', token); // 和Postman里的token对比,看看是否一致 if (!token) { alert('未获取到Token,请重新登录'); return; // 没有token就不要发起请求了 }
如果token是空或者和Postman里的不一样,那就要检查登录后存储token的逻辑是否正确。
4. 优化异步操作的顺序
你的代码里this.setState是异步的,但这里发起fetch的时机是对的(先拿到staff_id再请求),不过可以确保token和staff_id都获取到之后再发起请求,避免潜在的异步问题:
_loadInitialState = async () => { const token = await AsyncStorage.getItem('token'); const myArray = await AsyncStorage.getItem('language_type'); _onSetLanguage(myArray) const loadAll = this.props.navigation.getParam('loadAll'); const have_access = this.props.navigation.getParam('have_access'); const staff_id = this.props.navigation.getParam('id'); // 先做参数校验 if (!token) { alert('请重新登录'); return; } if (!staff_id) { alert('用户ID错误'); return; } // 再批量设置状态和发起请求 this.setState({ isLoading: loadAll === true, have_access: have_access ?? (staticData.get_centre_settings() != null), today: Moment().format('YYYY-MM-DD'), token, staff_id, view_access: true }); const requestUrl = FetchURL.get_baseURL() + "leave/" + staff_id; fetch(requestUrl, { method: 'GET', headers: { 'Authorization': 'Bearer '+ token, } }) // ... 后面的处理逻辑同上 }
总结
最常见的原因就是请求URL不正确(staff_id为空)或者Token无效,导致服务器返回非JSON响应。通过打印参数和原始响应,你很快就能定位到问题所在。
内容的提问来源于stack exchange,提问作者Intern 2

