Advanced Fastify: Hooks, Middleware, and Decorators
Статья про использование хуков, мидлварок и декораторов в fastify. Ниже приведу краткий пересказ.
Хуки используются, чтоб добавить кастомную логиу перед или после какого-то действия. Например, перед отправкой ответа можно добавлять служебные заголовки
Например
```
fastify.addHook("onSend", (request, reply, payload, done) = {
reply.headers({
Server: "fastify",
});
done();
});
```
Хуки можно навесить как глобальные, так и на отдельные роуты. Хуки могут быть связаны как с запросами или ответами, так и с циклом работы приложения.
Мидлварки позволяет добавить в цепь обработки запроса кастомную логику. Например, популярные использования для мидлварок - парсинг cookie или body у запроса. Fastify поддерживает expressjs-style мидлварок с помощью плагинов, но лучше использовать нативные fastify middlewares.
Например, подключение `cookie-parser` позволяет удобно работать с куками в обработчиках запросов.
```
import Fastify from "fastify";
import middie from "@fastify/middie";
import cookieParser from "cookie-parser";
const fastify = Fastify({
logger: true,
});
await fastify.register(middie);
fastify.use(cookieParser());
```
Также в fastify есть декораторы. По названию кажется что это еще 1 API для добавления логики к обработчикам запросов, но это не так. Декораторы позволяют добавлять новые свойства или функции к объекту fastify приложения, запроса или ответа. По сути, они позволяют добавить кастомное API во встроенные в fastify объекты. Например, можно добавить метод `isAuth` прямо в request, что звучит достаточно удобно.
Также fastify имеет встроенную поддержку валидации данных через JSON-схему
```
fastify.post(
"/users",
{
schema: {
body: bodySchema,
},
},
async (request, reply) = {
/* обработка запроса */
}
);
```
Если запрос не проходит валидацию, fastify отвечает 400 кодом с описанием, какое поле не прошло валидацию.
Если вам надо переехать на fastify с expressjs, то можно использовать плагин `@fastify/express`, который облегчает использование `expressjs` кода в fastify окружении.
