Ответы: 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(данные).