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

SvelteKit中Server Hooks重定向失效问题求助

解决SvelteKit hooks中已登录用户访问未保护路由重定向失败的问题

问题原因

  1. SvelteKit的redirect函数是通过抛出异常触发重定向,而非普通返回值。你把redirect(303, '/home')放在了jwt.verify的try块中,调用时抛出的异常会被外层catch捕获,进而执行catch里的redirect(303, '/'),最终覆盖了预期的/home跳转。
  2. 尝试用Response返回重定向时,未提前终止函数执行,后续的return resolve(event)会覆盖这个Response,导致重定向不生效。

解决方案

  • 缩小try/catch范围,仅将可能抛出错误的jwt.verify逻辑包裹在try中,路由判断和重定向逻辑移到try块外,避免redirect的异常被错误捕获。
  • 触发重定向后,确保函数不再执行后续代码(直接调用redirect或返回Response)。

修改后的完整代码

import 'dotenv/config';
import { redirect } from '@sveltejs/kit';
import jwt from 'jsonwebtoken';
const unProtectedRoutes = ['/', '/registro', '/registro/pn','/registro/pj','/forgotmail','/forgot'];
const SECRET_KEY = process.env.SECRET_KEY;

export const handle = async ({ event, resolve }) => {
    console.log(event.url.pathname);
    console.log(process.env.SECRET_KEY);
    const token = event.cookies.get('access_token');
    console.log(token);

    // 未登录访问受保护路由,重定向到登录页
    if (!token && !unProtectedRoutes.includes(event.url.pathname)) {
        redirect(303, '/');
    }

    if (token) {
        let decoded;
        try {
            // 仅将JWT验证逻辑放在try中,捕获token无效/过期错误
            decoded = jwt.verify(token, SECRET_KEY, { algorithms: ['RS256'] });
            console.log(decoded);
        } catch (error) {
            console.error('Error al verificar el token:', error);
            event.cookies.delete('access_token', { path: '/' });
            redirect(303, '/');
        }

        // 路由判断逻辑移到try外,避免redirect异常被捕获
        if (event.url.pathname === '/logout') {
            console.log('entre logoutF');
            event.cookies.delete('access_token', { path: '/' });
            redirect(303, '/');
        }

        if (unProtectedRoutes.includes(event.url.pathname)) {
            console.log('SI esta en la');
            redirect(303, '/home');
        }
    }

    return resolve(event);
};

补充:用Response实现重定向的正确方式

如果坚持用Response返回,需要直接return终止函数,不要执行后续的resolve(event):

if (unProtectedRoutes.includes(event.url.pathname)) {
    console.log('SI esta en la');
    return new Response(null, {
        status: 303,
        headers: {
            location: '/home'
        }
    });
}

内容的提问来源于stack exchange,提问作者Jose Martin Castro Agüero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:55:08