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

Next.js中如何在getStaticProps里获取localStorage数据?

问题根源
  • getStaticProps 是 Next.js 中用于构建时(或增量静态再生阶段)获取数据的函数,运行在服务器环境,而非浏览器客户端。
  • localStorage 是浏览器专属的 Web API,仅存在于客户端环境中,服务器端代码根本无法访问这个对象,直接调用会抛出 ReferenceError: localStorage is not defined 类的错误。
解决方案

根据你的业务需求,分两种场景处理:

场景1:页面渲染时需要用localStorage数据(客户端渲染)

把获取localStorage的逻辑放到客户端组件里,用useEffect钩子在客户端挂载后执行:

import { useEffect, useState } from 'react';

function TargetPage() {
  const [localStorageData, setLocalStorageData] = useState({ id: '', token: '' });

  useEffect(() => {
    const data = {
      id: localStorage.getItem("id"),
      token: localStorage.getItem("token"),
    };
    setLocalStorageData(data);
  }, []);

  // 后续用localStorageData渲染页面内容
  return (
    <div>
      <p>用户ID:{localStorageData.id}</p>
      <p>Token:{localStorageData.token}</p>
    </div>
  );
}

export default TargetPage;

场景2:必须在服务端处理用户数据(比如验证token)

如果需要在服务端做token校验这类逻辑,不能依赖localStorage,得通过Cookie传递数据:

  1. 客户端先把数据存入Cookie:
// 客户端代码(比如登录成功后)
document.cookie = `id=${userId}; path=/; secure; sameSite=Strict`;
document.cookie = `token=${userToken}; path=/; secure; sameSite=Strict; HttpOnly`;
  1. 改用getServerSideProps(因为getStaticProps是构建时执行,无法获取实时请求数据)在服务端解析Cookie:
export async function getServerSideProps(context) {
  const cookieStr = context.req.headers.cookie;
  let id = '';
  let token = '';

  if (cookieStr) {
    const cookiePairs = cookieStr.split('; ');
    cookiePairs.forEach(pair => {
      const [key, value] = pair.split('=');
      if (key === 'id') id = value;
      if (key === 'token') token = value;
    });
  }

  // 这里可以用id和token调用后端接口做验证等操作
  return { props: { id, token } };
}
注意事项
  • 服务端代码永远不要直接调用浏览器专属API(localStorage、window、document等)。
  • 敏感数据(比如token)存在localStorage有XSS攻击风险,存入Cookie并设置HttpOnly属性更安全。

内容的提问来源于stack exchange,提问作者Samiul Islam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:01:14