Encodera

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

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

Оглавление

Параметры, 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.ipIP-адрес клиента
request.logЛоггер этого запроса

Пока данные никак не проверяются: клиент может прислать пустой заголовок или строку вместо числа. Проверку по схеме добавим в главе о схемах.

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

Сравнение параметра с числом без преобразования никогда не сработает:

// src/routes/posts.js
// Неправильно: '2' === 2 — это false.
posts.find((post) => post.id === request.params.id);

Переводите параметры в число через Number() — или задайте тип в схеме, и Fastify сделает это сам.

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

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