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

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');
    }
};

数据库字段更新截图


问题根源及修复方案

你的代码存在三个核心问题:

  1. 全局变量跨请求污染:session和user被声明为全局变量,SvelteKit的服务器端函数是多请求共享的,这会导致不同请求的数据互相覆盖,出现会话信息错乱。
  2. Action未使用当前请求的会话:Action里直接用了全局的session,但这个session是load阶段初始化的,并非当前表单提交请求的会话,可能已经过期或不是同一个用户的会话。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:11:23