中间件
约 510 字大约 2 分钟
2026-09-22
在 svelte-kit 中, 中间件是使用 hooks 来实现的, 他们分为了 server 和 client 两种, 其中 server 是在服务端执行的, 而 client 是在客户端执行的.
server
中间件固定在 /src/hooks.server.ts 文件中, 这个文件是一个特殊的文件, 用来处理请求和响应的中间件.
// 需要导入类型 Handle, 这个类型是一个函数类型, 用来处理请求和响应的中间件.
import type { Handle } from '@sveltejs/kit'
import { sequence } from '@sveltejs/kit/hooks'
// ↓ 这里还能取出 cookoie, headers 等等
const logger: Handle = async ({ event, resolve }) => {
console.log('请求路径:', event.url.pathname)
// 构建原本需要的返回内容
const response = await resolve(event)
console.log('响应状态码:', response.status)
return response
}
const logger2: Handle = async ({ event, resolve }) => {
console.log('请求路径:', event.url.pathname)
// 构建原本需要的返回内容
const response = await resolve(event)
console.log('响应状态码:', response.status)
return response
}
// 这里的 sequence 函数是用来组合多个中间件的, 也就是可以把多个中间件组合成一个中间件, 然后在 handle 中使用.
// 比如这里的 logger 和 logger2 就是两个中间件, 通过 sequence 函数组合成一个中间件, 然后在 handle 中使用.
export const handle = sequence(logger, logger2)比如如果需要对接 better-auth 就大概率会使用到中间件
import type { Handle } from '@sveltejs/kit'
import { building } from '$app/environment'
import { auth } from '$lib/auth'
import { sequence } from '@sveltejs/kit/hooks'
import { svelteKitHandler } from 'better-auth/svelte-kit'
const authHandle: Handle = async ({ event, resolve }) => {
return svelteKitHandler({ event, resolve, auth, building })
}
// 这里也可以直接把 authHandle 放在 handle 中, 但是一般还会有其他中间件
export const handle = sequence(authHandle)client
文件路径: /src/hooks.client.ts
里面只会有一个 handleError 函数, 用来处理客户端的错误, 这个函数会在客户端发生错误时被调用, 可以用来捕获错误, 记录日志, 或者显示错误提示等.
import type { HandleServerError } from '@sveltejs/kit'
import * as Sentry from '@sentry/sveltekit'
Sentry.init({/* ... */})
export const handleError: HandleServerError = async ({ error, event, status, message }) => {
const errorId = crypto.randomUUID()
// example integration with https://sentry.io/
Sentry.captureException(error, {
extra: { event, errorId, status }
})
return {
message: 'Whoops!',
errorId
}
}