SvelteKit数据库更新后服务器未同步,无法跳转及获取正确数据
问题:更新用户属性后跳转失效且数据刷新后回退
我在实现新注册用户提交欢迎表单的功能时,需要将用户的wizard布尔值从false改为true,提交后跳转到用户仪表盘。目前遇到的问题:
- 提交表单后,MySQL Workbench显示该布尔值已更新
- 服务器并未执行跳转
- 页面刷新后,从数据库获取的用户
wizard值仍为false,而非预期的true
相关代码如下:
import { auth } from "$lib/server/lucia"; import type { PageServerLoad,Actions } from './$types.js'; import { redirect } from "@sveltejs/kit"; export const load: PageServerLoad = async ({ locals }) => { session = await locals.auth.validate(); user = await auth.getUser(session.user.userId) if (session && user.wizard == true) throw redirect(302, "/"); return {}; }; let session; let user export const actions: Actions = { default: async ({ request, locals }) => { const formData = Object.fromEntries(await request.formData()) try { user = await auth.updateUserAttributes(session.user.userId, { wizard: true }); } catch (e) { console.log(e) } throw redirect(302, '/dashboard'); } };

问题根源及修复方案
你的代码存在三个核心问题:
- 全局变量跨请求污染:
session和user被声明为全局变量,SvelteKit的服务器端函数是多请求共享的,这会导致不同请求的数据互相覆盖,出现会话信息错乱。 - Action未使用当前请求的会话:Action里直接用了全局的
session,但这个session是load阶段初始化的,并非当前表单提交请求的会话,可能已经过期或不是同一个用户的会话。 - Lucia会话未同步更新:更新用户属性后,Lucia的会话缓存没有刷新,导致后续读取用户数据时还是旧值。
修正后的代码:
import { auth } from "$lib/server/lucia"; import type { PageServerLoad, Actions } from './$types.js'; import { redirect } from "@sveltejs/kit"; export const load: PageServerLoad = async ({ locals }) => { // 每次请求都重新验证会话,不使用全局变量 const session = await locals.auth.validate(); if (!session) throw redirect(302, "/login"); const user = await auth.getUser(session.user.userId); if (user.wizard) { throw redirect(302, "/"); } return {}; }; export const actions: Actions = { default: async ({ request, locals }) => { // 重新获取当前请求的会话 const session = await locals.auth.validate(); if (!session) throw redirect(302, "/login"); try { // 更新用户属性 await auth.updateUserAttributes(session.user.userId, { wizard: true }); // 刷新会话,同步Lucia缓存中的用户数据 await locals.auth.refreshSession(session.sessionId); } catch (e) { console.error("更新用户属性失败:", e); return { error: "更新失败,请重试" }; } throw redirect(302, '/dashboard'); } };
关键修正点说明
- 移除全局的
session和user变量,在每个函数内部单独声明,避免跨请求数据干扰。 - 在Action中重新验证会话,确保使用的是当前表单提交请求的有效会话。
- 更新用户属性后调用
refreshSession,让Lucia更新会话缓存,避免刷新页面后读取到旧的用户数据。 - 完善错误日志,方便排查潜在的更新失败问题。
内容的提问来源于stack exchange,提问作者Stef Verniers
相关产品推荐
相关产品推荐

