Redux Toolkit解析localStorage报Unexpected token u错误如何解决
代码问题说明
- 逻辑顺序错误:你的容错判断
user ? user : null在JSON解析动作之后执行,一旦解析过程报错,后续的赋值逻辑根本不会触发。 - 缺少前置校验:
localStorage.getItem("user")在以下场景不会返回预期的合法JSON字符串:- 本地从未存储过
user键、且运行环境存在异常(比如SSR环境下localStorage未挂载、存储权限被拦截)时,取值结果为undefined - 之前的存值逻辑异常,写入了非JSON格式的脏数据(比如直接存入
undefined被转成的"undefined"字符串、其他乱码内容)
- 本地从未存储过
JSON.parse接收到非合法JSON格式的入参时,会直接抛出语法错误,你遇到的Unexpected token u in JSON at position 0就是因为入参被转成字符串后首字符是u(来自undefined字符串),不符合JSON语法规则。
修正代码
核心思路是先做取值校验,再执行JSON解析,同时增加异常捕获兜底,避免脏数据导致整个状态初始化失败:
// 先从localStorage取值,不直接做解析 const storedUser = localStorage.getItem("user"); let user = null; if (storedUser) { try { // 确认有存储值时再尝试解析 user = JSON.parse(storedUser); } catch (error) { // 解析失败说明存储内容损坏,清除脏数据,兜底为null localStorage.removeItem("user"); user = null; } } const initialState = { user, isError: false, isSuccess: false, isLoading: false, message: "", };
如果想要更精简的写法,也可以用立即执行函数包裹逻辑:
const initialState = { user: (() => { try { const stored = localStorage.getItem("user"); return stored ? JSON.parse(stored) : null; } catch { localStorage.removeItem("user"); return null; } })(), isError: false, isSuccess: false, isLoading: false, message: "", };
内容的提问来源于stack exchange,提问作者Lameck Meshack
相关产品推荐
相关产品推荐

