SvelteKit版本迁移:session及GetSession的新引用方式咨询
SvelteKit迁移后Session的正确使用方式
SvelteKit最新版本已移除内置的session store及相关的GetSession类型,替代方案如下:
1. 服务端处理(hooks & server load)
原来的hooks.ts需改为**hooks.server.ts**,直接在handle中将session挂载到event.locals:
import type { Handle } from '@sveltejs/kit'; export const handle: Handle = async ({ event, resolve }) => { // 替换为你实际的session获取逻辑(比如从cookie、数据库读取) const session = await yourSessionFetchLogic(event.cookies.get('session_id')); // 将session挂载到locals,供server组件调用 event.locals.session = session; return resolve(event); };
在根+layout.server.ts中,通过locals获取session并传递给前端的page.data:
import type { LayoutServerLoad } from './$types'; export const load: LayoutServerLoad = async ({ locals }) => { return { session: locals.session }; };
2. 前端组件中使用
在+layout.svelte或+page.svelte中,通过page store访问session:
<script lang="ts"> import { page } from '$app/stores'; </script> {#if $page.data.session} <div>当前用户:{$page.data.session.user.name}</div> {:else} <div>未登录</div> {/if}
3. 全局响应式session(可选)
如果需要在非页面组件中全局使用响应式session,可以自定义store:
// src/lib/stores/session.ts import { writable } from 'svelte/store'; import type { PageData } from '../$types'; export const session = writable<PageData['session'] | null>(null);
在根+layout.svelte中同步page.data到自定义store:
<script lang="ts"> import { page } from '$app/stores'; import { session } from '$lib/stores/session'; // 自动同步page.data中的session到全局store $: $session = $page.data.session; </script>
内容的提问来源于stack exchange,提问作者Ben Quan
相关产品推荐
相关产品推荐

