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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:09:27