Определение маршрута с параметром
Маршруты в 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, указав основной вариант адреса.
Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.