Создать URL
Генератор Правила транслитерации Как сделать ЧПУ Блог Вопросы и ответы Создать URL
Разработка

Роутинг в Express и Node.js

Продолжаем обзор технологий разработки платформой Node.js и фреймворком Express, где маршруты описываются просто, а ошибки — так же легко.

Определение маршрута с параметром

Маршруты в Express описываются вызовами, где указывается метод запроса, шаблон адреса и функция-обработчик. Параметры адреса объявляются с двоеточием и доступны обработчику.

app.get('/blog/:slug', async (req, res) => {
  const post = await Post.findOne({ slug: req.params.slug });
  if (!post) return res.status(404).send('Not found');
  res.send(post.html);
});

Порядок описания маршрутов имеет значение

Express проверяет маршруты по порядку, в котором они объявлены, и выполняет первый подходящий. Более общий маршрут, объявленный раньше конкретного, «перехватит» запрос, и до нужного обработчика дело не дойдёт.

  • сначала объявляйте конкретные маршруты;
  • затем — параметризованные;
  • в самом конце — универсальный обработчик несуществующих страниц.

Корректный код ответа для несуществующих страниц

Частая ошибка — отдавать страницу «не найдено» с кодом 200. Как разбиралось в статье про мягкую 404, это вводит поисковую систему в заблуждение, поэтому для отсутствующего материала обязательно устанавливайте статус 404.

Единый формат адресов и постоянные редиректы

Приведите адреса к единому виду — например, без завершающего слеша и в нижнем регистре — и перенаправляйте все альтернативные варианты на основной постоянным редиректом с кодом 301.

app.use((req, res, next) => {
  if (req.path.length > 1 && req.path.endsWith('/')) {
    return res.redirect(301, req.path.slice(0, -1));
  }
  next();
});

Промежуточные обработчики для приведения адресов к единому виду

Вместо того чтобы обрабатывать особенности адресов в каждом маршруте, удобнее подключить единый промежуточный обработчик, который нормализует адрес до того, как запрос дойдёт до конкретной логики.

  • приведение регистра к нижнему;
  • удаление или добавление завершающего слеша по выбранному правилу;
  • перенаправление с альтернативных вариантов на основной.

Отдача статических файлов и заголовки кеширования

Для изображений, стилей и скриптов подключается встроенный обработчик статических файлов. Не забудьте настроить для них разумное время кеширования и, как разбирается в статье про тонкую настройку кеширования, версионирование адресов при длительном кешировании.

Единая обработка ошибок и правильные коды ответа

Настройте общий обработчик ошибок, который различает «не найдено» и внутреннюю ошибку сервера и отдаёт соответствующие коды. Так сайт не будет случайно возвращать код успеха там, где произошёл сбой, а робот получит точную картину состояния страниц.

Работа за прокси и принудительный https

Приложение на Express часто размещают за обратным прокси-сервером. В этом случае перенаправление на https и единый вариант домена удобнее настраивать на уровне прокси, а в самом приложении достаточно доверять переданным им заголовкам протокола.

Частые вопросы

Почему порядок маршрутов в Express важен?

Фреймворк выполняет первый подходящий маршрут, поэтому общий шаблон, объявленный раньше конкретного, перехватит запрос и не даст сработать нужному обработчику.

Какой код ответа отдавать для несуществующей страницы?

Всегда код 404, а не 200: иначе поисковая система может воспринять пустую страницу как существующую.

Как настроить постоянный редирект в Express?

Используйте вызов redirect с кодом 301, указав основной вариант адреса.

Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.

Читайте также

4 мин чтения

Динамические маршруты в Next.js

В Next.js структура адресов задаётся структурой каталогов, а динамические сегменты в квадратных скобках превращают одну страницу в шаблон для сотен адресов.

Читать статью →