You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native跳转详情页遇JSON Parse error: Unexpected EOF问题求助

解决React Native详情页API请求的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:52:38