全书目录

第三十篇:SvelteKit 完全指南 —— 轻量反应式剧场宇宙

第十二章:`hooks.server` —— 真正的总控室

1 分钟 235 字 第 550 / 962 个阅读单元

hooks.server.ts 是 SvelteKit 里最像“总控室”的地方。

它会在每个进入剧场的请求上介入。
这意味着它很适合做:

  • 从 cookie 读取会话
  • 把用户挂到 event.locals
  • 统一埋点
  • 某些全局鉴权前置逻辑
  • 修改响应头
  • 特定路径的特殊处理

典型例子:

ts
// src/hooks.server.ts
import type { Handle } from '@sveltejs/kit';
import { getUserBySession } from '$lib/server/auth';

export const handle: Handle = async ({ event, resolve }) => {
  const session = event.cookies.get('session');

  event.locals.user = session
    ? await getUserBySession(session)
    : null;

  const response = await resolve(event);

  response.headers.set('x-theater', 'stardust');
  return response;
};

然后你就可以在服务端 loadactions+server 里共享这一请求上下文:

ts
// src/routes/admin/+page.server.ts
import { redirect } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';

export const load: PageServerLoad = async ({ locals }) => {
  if (!locals.user?.isAdmin) {
    redirect(303, '/login');
  }

  return {};
};

这条链路特别像现实剧院:

text
观众入场
-> 总控室先看证件
-> 把身份信息贴到本次通行单上
-> 后续各岗位都能读这张单子

SvelteKit 里的这张“通行单”,就是 event.locals