SvelteKit中hooks.server.ts与Auth.js同名handle函数共存方案问询
在SvelteKit的hooks.server.ts中整合Auth.js的handle与自定义逻辑
核心解决思路是将Auth.js生成的handle重命名后,作为中间件嵌套到自定义handle中,这样既能保留Auth的认证功能,又能在自定义逻辑里操作数据库。具体实现步骤如下:
- 在
hooks.server.ts中直接初始化Auth.js,将其导出的handle重命名为authHandle(避免和自定义handle重名):
import { SvelteKitAuth } from '@auth/sveltekit'; import github from '@auth/sveltekit/providers/github'; import { GITHUB_ID, GITHUB_SECRET } from '$env/static/private'; // 初始化Auth并把它的handle重命名为authHandle const { handle: authHandle } = SvelteKitAuth({ providers: [github({ clientId: GITHUB_ID, clientSecret: GITHUB_SECRET })], // 你的其他Auth配置项... });
- 编写自定义handle函数,嵌套调用
authHandle,同时插入数据库操作逻辑:
export async function handle({ event, resolve }) { // 认证前的逻辑:比如预处理请求、查询数据库 // 示例:await db.logRequest(event.request.url); // 调用Auth的认证中间件,传递当前的event和resolve const response = await authHandle({ event, resolve }); // 认证后的逻辑:比如根据会话更新用户数据 // 示例:const session = await event.locals.auth(); // if (session) await db.updateUserLastActive(session.user.id, new Date()); return response; }
这样做的原理是:Auth.js的handle本身就是一个符合SvelteKit规范的中间件函数,它会负责处理认证流程、给event.locals注入auth()方法,之后再调用传入的resolve完成请求处理。通过嵌套调用,你可以在认证流程的前后自由插入自定义的数据库操作或其他逻辑。
另外,原来+layout.server.ts中的load函数不需要修改,event.locals.auth()依然能正常获取会话信息。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

