Flatiron School项目配置useContext全局用户状态时遇JSON语法错误
解决useContext全局状态中出现的‘Unexpected end of JSON input’错误
这个错误是因为res.json()尝试解析空内容或者非JSON格式的响应导致的,结合你的代码,核心问题出在fetch('/me')的响应处理环节,下面是具体的修复方案:
错误根源
- 后端接口
/me返回了空内容(比如状态码204 No Content) - 后端返回的不是合法JSON格式(比如错误时返回HTML页面)
- 请求失败(比如401未授权、500服务器错误)但未处理错误状态,直接尝试解析JSON
修复步骤
1. 给fetch添加完整的错误处理逻辑
在解析JSON前先校验响应状态,同时捕获Promise异常,避免出现Unhandled Rejection:
import React, { useState, useEffect } from "react"; const UserContext = React.createContext(); function UserProvider({ children }) { const [user, setUser] = useState({}) useEffect(() => { fetch('/me') .then(res => { // 先判断请求是否成功 if (!res.ok) { throw new Error(`请求状态异常:${res.status}`); } return res.json(); }) .then(data => { setUser(data); }) .catch(err => { console.error('获取用户信息失败:', err); // 可根据业务需求处理,比如设置空用户或跳转登录页 setUser({}); }); }, []); return ( <UserContext.Provider value={{user}}> {children} </UserContext.Provider> ); } export { UserContext, UserProvider };
2. 排查后端接口的响应内容
打开浏览器开发者工具(F12)的「Network」标签,找到/me请求,查看:
- 状态码:如果是401/404/500,说明后端接口逻辑存在问题(比如未登录时未正确返回对应内容)
- Response内容:确认返回的是合法JSON,而非空文本、HTML错误页
3. 处理后端返回空内容的场景
如果后端在用户未登录时会返回204状态码(无内容),可以单独处理这种情况:
useEffect(() => { fetch('/me') .then(res => { if (res.status === 204) { // 后端返回空,直接返回空对象作为默认值 return {}; } else if (!res.ok) { throw new Error(`请求状态异常:${res.status}`); } return res.json(); }) .then(data => setUser(data)) .catch(err => { console.error('获取用户信息失败:', err); setUser({}); }); }, []);
额外提示
- 开发时务必给Promise添加
catch处理,避免控制台抛出Unhandled Rejection错误 - 如果需要区分「未登录」和「请求失败」,可以把user初始状态设为
null,在对应逻辑中设置不同状态
内容的提问来源于stack exchange,提问作者mars916
相关产品推荐
相关产品推荐

