Encodera

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

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

Оглавление

Ответы: reply

Второй аргумент обработчика — объект reply, ответ сервера. Через него задают код состояния (число вроде 200 или 404, по которому клиент понимает результат), заголовки и тело ответа.

Код ответа

По умолчанию Fastify отвечает кодом 200. Созданный ресурс принято возвращать с кодом 201:

// src/routes/posts.js
app.post('/posts', async (request, reply) => {
  const post = { id: posts.length + 1, ...request.body };
  posts.push(post);
  reply.code(201);
  return post;
});

reply.code(201) только меняет код, а тело по-прежнему берётся из return. curl с флагом -i покажет первую строку ответа HTTP/1.1 201 Created.

reply.send

Вместо return ответ можно отправить явно. Методы reply возвращают сам reply, поэтому их записывают цепочкой:

// src/routes/posts.js
app.get('/posts/:id', async (request, reply) => {
  const post = posts.find((item) => item.id === Number(request.params.id));
  if (!post) {
    return reply.code(404).send({ error: 'Статья не найдена' });
  }
  return post;
});

Адрес /posts/99 вернёт код 404 и {"error":"Статья не найдена"}, а /posts/1 — саму статью.

Пустой ответ

После удаления возвращать нечего. Для этого есть код 204 «No Content»:

// src/routes/posts.js
app.delete('/posts/:id', async (request, reply) => {
  const index = posts.findIndex((post) => post.id === Number(request.params.id));
  if (index !== -1) {
    posts.splice(index, 1);
  }
  return reply.code(204).send();
});

Команда curl -i -X DELETE http://localhost:3000/posts/1 покажет 204 No Content без тела.

Заголовки и тип

МетодЧто делает
reply.code(404)Код ответа
reply.header('cache-control', 'no-store')Один заголовок
reply.headers({ ... })Несколько заголовков объектом
reply.type('text/plain')Заголовок Content-Type
reply.redirect('/posts')Перенаправление

Строку Fastify отправляет как text/plain, объект и массив — как application/json.

Перенаправление

// src/routes/posts.js
app.get('/articles', async (request, reply) => {
  return reply.redirect('/posts', 301);
});

Откройте http://localhost:3000/articles — браузер перейдёт на /posts. Второй аргумент — код: 301 означает «адрес переехал навсегда», без него используется 302.

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

Нельзя одновременно вызвать reply.send() и вернуть значение: ответ уйдёт дважды, и в логе появится предупреждение «Reply was already sent». В асинхронном обработчике выбирайте одно — return данные или return reply.send(данные).

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

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