Параметры, query и тело запроса
Обработчик получает первым аргументом объект request — всё, что прислал клиент. Чаще всего из него берут три вещи: параметры маршрута, строку запроса (query — часть адреса после ?) и тело запроса (body — данные, которые клиент отправил методом POST или PUT).
Параметры маршрута
Часть адреса с двоеточием попадает в request.params. Добавьте в src/routes/posts.js маршрут одной статьи:
// src/routes/posts.js
app.get('/posts/:id', async (request) => {
const id = Number(request.params.id);
return posts.find((post) => post.id === id);
});Откройте http://localhost:3000/posts/2 — появится вторая статья. Параметры всегда приходят строками, поэтому id переводится в число.
В маршруте может быть несколько параметров:
// src/routes/comments.js
export default async function commentRoutes(app) {
app.get('/posts/:id/comments/:commentId', async (request) => {
const { id, commentId } = request.params;
return { id, commentId };
});
}Не забудьте подключить новый файл в src/app.js через app.register(commentRoutes). Адрес /posts/1/comments/7 вернёт {"id":"1","commentId":"7"}.
Строка запроса
Параметры после ? Fastify собирает в объект request.query:
// src/routes/posts.js
app.get('/posts', async (request) => {
const limit = Number(request.query.limit ?? 10);
return posts.slice(0, limit);
});Адрес /posts?limit=1 вернёт только первую статью, а /posts без параметра — до десяти статей.
Тело запроса
Если клиент отправил JSON с заголовком Content-Type: application/json, Fastify сам разберёт его в request.body:
// src/routes/posts.js
app.post('/posts', async (request) => {
const { title, body } = request.body;
const post = { id: posts.length + 1, title, body };
posts.push(post);
return post;
});Отправьте новую статью из терминала:
curl -X POST http://localhost:3000/posts \
-H "Content-Type: application/json" \
-d '{"title":"Новая статья","body":"Текст"}'Сервер вернёт статью с id 3, и она появится в списке /posts — до перезапуска сервера.
Что ещё есть в request
| Свойство | Что внутри |
|---|---|
request.params | Параметры маршрута |
request.query | Строка запроса |
request.body | Разобранное тело |
request.headers | Заголовки, имена в нижнем регистре |
request.ip | IP-адрес клиента |
request.log | Логгер этого запроса |
Пока данные никак не проверяются: клиент может прислать пустой заголовок или строку вместо числа. Проверку по схеме добавим в главе о схемах.
Частая ошибка
Сравнение параметра с числом без преобразования никогда не сработает:
// src/routes/posts.js
// Неправильно: '2' === 2 — это false.
posts.find((post) => post.id === request.params.id);Переводите параметры в число через Number() — или задайте тип в схеме, и Fastify сделает это сам.