Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Хуки: 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.