Хуки: hooks.server.js
Хук (hook) — функция, которую SvelteKit вызывает на определённом этапе работы для всех запросов сразу. Через хуки делают то, что нужно каждой странице: определяют пользователя по cookie, пишут журнал запросов, добавляют заголовки. Серверные хуки живут в файле src/hooks.server.js.
Хук handle
Создайте файл src/hooks.server.js и экспортируйте функцию handle:
// src/hooks.server.js
export async function handle({ event, resolve }) {
const start = Date.now();
const response = await resolve(event);
console.log(`${event.request.method} ${event.url.pathname} — ${Date.now() - start} мс`);
return response;
}handle получает событие запроса и функцию resolve, которая строит обычный ответ — страницу или результат +server.js. Откройте несколько страниц сайта: в терминале, где запущен npm run dev, появятся строки вроде GET /blog — 12 мс.
event.locals
Хук может положить данные в объект event.locals. Он доступен во всех функциях load, действиях и +server.js этого запроса:
// src/hooks.server.js
export async function handle({ event, resolve }) {
const name = event.cookies.get('author');
event.locals.author = name ?? 'Гость';
return resolve(event);
}Теперь любая серверная функция знает автора текущего запроса:
// src/routes/blog/new/+page.server.js (рядом с actions)
export function load({ locals }) {
return { author: locals.author };
}На странице /blog/new значение доступно как data.author: пока cookie author нет, это «Гость». Так обычно передают вошедшего пользователя после проверки сессии в хуке.
Ответ без страницы
handle может ответить сам, не вызывая resolve. Например, закрыть раздел на время работ:
// src/hooks.server.js
export async function handle({ event, resolve }) {
if (event.url.pathname.startsWith('/admin')) {
return new Response('Раздел временно закрыт', { status: 503 });
}
return resolve(event);
}Любой адрес, начинающийся с /admin, вернёт текст с кодом 503.
Хук handleError
Функция handleError в том же файле вызывается при непредвиденной ошибке — исключении в load или в компоненте:
// src/hooks.server.js
export function handleError({ error, event }) {
console.error('Ошибка на', event.url.pathname, error);
return { message: 'Что-то пошло не так' };
}Полный текст ошибки попадёт в журнал сервера, а посетитель увидит только безопасное сообщение из возвращённого объекта. Ошибки, вызванные через error(404, ...), считаются ожидаемыми и сюда не попадают.
Частая ошибка
Забыть вернуть результат resolve(event). Если handle ничего не возвращает, ни одна страница сайта не откроется — SvelteKit сообщит, что хук не вернул ответ. Последней строкой handle должен быть return resolve(event) или return response.