Encodera

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

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

Оглавление

Параметры маршрута и строка запроса

Часто адрес содержит данные: номер статьи в /posts/2 или номер страницы в /posts?page=3. Первое называют параметром маршрута, второе — строкой запроса (query string). Express разбирает оба и кладёт результат в объект запроса.

Данные блога

Пока базы данных нет, статьи храним в массиве. Создайте файл src/data/posts.js:

// src/data/posts.js
export const posts = [
  { id: 1, title: 'Знакомство с Express', body: 'Express — веб-фреймворк для Node.js.' },
  { id: 2, title: 'Маршруты', body: 'Маршрут связывает адрес с функцией.' },
];

Параметр маршрута

Часть адреса после двоеточия становится параметром. Его значение лежит в req.params:

// src/app.js
import { posts } from './data/posts.js';
 
app.get('/posts/:id', (req, res) => {
  const id = Number(req.params.id);
  const post = posts.find((item) => item.id === id);
 
  if (!post) {
    return res.status(404).send('Статья не найдена');
  }
 
  res.send(post.title);
});

По адресу /posts/2 страница покажет «Маршруты», а /posts/99 — «Статья не найдена». Значение параметра всегда строка, поэтому перед сравнением её превращают в число.

Несколько параметров

Параметров в адресе может быть несколько:

// src/app.js
app.get('/posts/:postId/comments/:commentId', (req, res) => {
  const { postId, commentId } = req.params;
  res.send(`Комментарий ${commentId} к статье ${postId}`);
});

/posts/2/comments/5 вернёт «Комментарий 5 к статье 2».

Необязательный параметр

В Express 5 необязательную часть адреса заключают в фигурные скобки:

// src/app.js
app.get('/archive{/:year}', (req, res) => {
  const year = req.params.year ?? 'все годы';
  res.send(`Архив: ${year}`);
});

Маршрут сработает и для /archive, и для /archive/2025.

Строка запроса

Всё, что стоит в адресе после ?, Express разбирает в объект req.query. Для этих значений не нужен отдельный маршрут:

// src/app.js
app.get('/posts', (req, res) => {
  const search = req.query.search ?? '';
  const found = posts.filter((post) => post.title.includes(search));
 
  res.send(found.map((post) => post.title).join(', '));
});

/posts?search=Мар покажет только «Маршруты», а /posts без строки запроса — все статьи.

Что выбрать

СпособКогда подходитПример
Параметр маршрутаАдрес конкретной записи/posts/2
Строка запросаПоиск, фильтры, сортировка, страницы/posts?page=2&sort=new

Ссылки строят обычной строкой: <a href="/posts/2"> или <a href="/posts?page=2"> в HTML.

Частая ошибка

Значения из req.params и req.query — строки, а не числа. Сравнение post.id === req.params.id всегда ложно, потому что 1 === '1' даёт false. Превращайте значение в число через Number() и проверяйте результат: Number('abc') даёт NaN, и такую статью искать не нужно — сразу отвечайте 404.

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

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