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

Auth.js是否兼容SvelteKit SSR?调用signIn遇window未定义错误

问题描述

我正在开发一款支持用户登录的SvelteKit应用,登录流程由自建API处理,因此希望使用Auth.js的Credentials Provider。但在+page.server.ts的FormAction中调用signIn方法时,出现‘window is not defined’错误。请问这是否意味着Auth.js不兼容SSR,还是存在可调整的配置?

我的代码

hooks.server.ts

SvelteKitAuth({
        providers: [
            // @ts-ignore
            Credentials({
                name: "credentials",
                async authorize(credentials, req) {
                    // TODO: Call Api
                    const user = { id: "1", name: "J Smith", email: "jsmith@example.com" }

                    if (user) {
                        return user
                    } else {
                        return null
                    }
                }
            })
        ],
    });

+page.server.ts

export const actions = {
    default: async ({ cookies, request }: { cookies: any, request: any }) => {
        const data = await request.formData();
        const credentials = {
            username: data.get('username'),
            password: data.get('password')
        };

        signIn('credentials', credentials)
            .then(response => {
                console.log('Success');
            })
            .catch(error => {
                console.error('error', error);
            });
    }
};
解答

这个错误和Auth.js兼容SSR无关,是你用错了服务端的signIn调用方式:

  • +page.server.ts中的代码是在服务端执行的,而你直接调用的signIn是Auth.js的客户端版本,它依赖浏览器环境的window对象,所以会抛出window is not defined错误。
  • Auth.js完全支持SvelteKit的SSR,服务端场景下需要通过locals对象调用服务端版本的signIn(Auth.js在hooks.server.ts初始化后会自动把相关方法挂载到locals上)。

修改后的+page.server.ts代码如下:

//+page.server.ts
export const actions = {
    default: async ({ request, locals }) => {
        const data = await request.formData();
        const credentials = {
            username: data.get('username'),
            password: data.get('password')
        };

        try {
            // 调用服务端版本的signIn
            await locals.signIn('credentials', credentials);
            console.log('登录成功');
            // 可在此处添加跳转逻辑或返回成功信息
        } catch (error) {
            console.error('登录失败:', error);
            // 返回错误信息给前端页面
            return { error: '用户名或密码错误' };
        }
    }
};

另外,服务端代码建议用async/await替代then/catch的异步写法,更符合SvelteKit服务端代码风格,也更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:50:21