Spring Boot后端登录返回200,React调用res.json()报Unexpected end of JSON input错误
问题根因
SyntaxError: Unexpected end of JSON input 报错的核心原因是调用res.json()时,后端返回的响应体为空,或者不是合法的JSON格式,无法被JSON解析器处理。
排查&修复步骤
1. 补全请求头配置
你当前的fetch请求没有指定Content-Type头,Spring Boot无法正确识别请求体是JSON格式,很可能解析请求参数失败,即使返回状态码200,响应体也会为空。修改请求配置添加请求头:
headers: { 'Content-Type': 'application/json' }
2. 修正响应处理逻辑
res.json()是异步方法,直接打印会输出Promise对象而非解析结果,同时建议先查看原始响应内容,不要直接解析为JSON,避免解析报错:
async submit(e){ e.preventDefault() const response = await fetch('http://localhost:8080/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(this.state) }) // 优先检查响应头是否携带JWT:Spring Security登录场景下,JWT通常放在Authorization响应头中,响应体本身为空 const jwtFromHeader = response.headers.get('Authorization') if(jwtFromHeader) { // 注意如果JWT带Bearer前缀,需要截取:jwtFromHeader.replace('Bearer ', '') console.log('从响应头获取的JWT:', jwtFromHeader) return } // 响应头没有JWT的话,查看原始响应体内容 const rawResponse = await response.text() console.log('原始响应内容:', rawResponse) try { // 确认是JSON格式再解析 const resData = JSON.parse(rawResponse) console.log('解析后的响应数据:', resData) } catch (err) { // 响应体是纯JWT字符串的话直接使用即可,无需解析 console.log('直接从响应体获取的JWT:', rawResponse) } }
3. 额外检查项
- 注意你的原方法名写为
sbmit,存在拼写错误,确认绑定事件的方法名是否匹配 - 如果确认后端返回JSON格式,检查后端是否配置了跨域允许前端读取自定义响应头,若JWT放在自定义响应头中,需要后端配置
Access-Control-Expose-Headers允许前端读取该字段
内容的提问来源于stack exchange,提问作者Med
相关产品推荐
相关产品推荐

