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
相关产品推荐
相关产品推荐

