Параметры маршрута и строка запроса
Часто адрес содержит данные: номер статьи в /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.