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

SvelteKit保护路由时出现localStorage is not defined错误求助

解决SvelteKit路由保护中localStorage未定义的问题

错误原因

+layout.server.ts是服务器端运行的代码,而localStorage是浏览器客户端专属的API,服务器环境中不存在这个对象,因此会抛出ReferenceError: localStorage is not defined。

解决方案

根据你的需求,有两种可行的实现方式:

方案一:客户端路由保护(使用+layout.ts)

将路由保护逻辑放在客户端执行,通过+layout.ts(而非+layout.server.ts)实现,同时判断浏览器环境避免服务器端报错:

import { redirect } from "@sveltejs/kit";
import type { LayoutLoad } from "./$types";

export const load: LayoutLoad = async ({ url }) => {
  // 仅在浏览器环境中执行判断
  if (typeof window !== "undefined") {
    const authToken = localStorage.getItem('auth_token');
    // 排除登录页面,防止循环重定向
    if (!authToken && url.pathname !== '/') {
      throw redirect(303, '/');
    }
  }
};

方案二:服务器端路由保护(推荐,使用Cookie存储Token)

如果需要更安全的服务器端验证,建议将auth_token存储在HttpOnly Cookie中,这样服务器端可以通过cookies对象读取并验证:

import { redirect } from "@sveltejs/kit";
import type { LayoutServerLoad } from "./$types";

export const load: LayoutServerLoad = async ({ cookies, url }) => {
  const authToken = cookies.get('auth_token');
  // 排除登录页面,防止循环重定向
  if (!authToken && url.pathname !== '/') {
    throw redirect(303, '/');
  }

  // 可选:验证Token有效性,将用户信息挂载到locals供组件使用
  return {
    user: authToken ? /* 这里添加Token验证逻辑,返回用户数据 */ null : null
  };
};

注意事项

  • 客户端路由保护可能被禁用JS绕过,敏感路由建议结合服务器端验证。
  • 无论哪种方案,都必须排除登录页面的重定向逻辑,否则会陷入无限循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:47:21