SvelteKit中Server Hooks重定向失效问题求助
解决SvelteKit hooks中已登录用户访问未保护路由重定向失败的问题
问题原因
- SvelteKit的
redirect函数是通过抛出异常触发重定向,而非普通返回值。你把redirect(303, '/home')放在了jwt.verify的try块中,调用时抛出的异常会被外层catch捕获,进而执行catch里的redirect(303, '/'),最终覆盖了预期的/home跳转。 - 尝试用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
相关产品推荐
相关产品推荐

