Mastering Fastify: Route Hooks and Decorators Explained
Written on
Chapter 1: Introduction to Fastify
Fastify is a lightweight framework for Node.js designed for building backend web applications. In this article, we will explore how to construct backend applications using Fastify.
Section 1.1: Understanding Route-Level Hooks
Fastify allows the incorporation of hooks at the route level, which enable developers to execute specific code at various stages of the request-response cycle. For instance, you can define a route as shown below:
const fastify = require('fastify')({});
fastify.route({
method: 'GET',
url: '/',
schema: {},
onRequest (request, reply, done) {
done();},
onResponse (request, reply, done) {
done();},
preParsing (request, reply, done) {
done();},
preValidation (request, reply, done) {
done();},
preHandler (request, reply, done) {
done();},
preSerialization (request, reply, payload, done) {
done(null, payload);},
handler (request, reply) {
reply.send({ hello: 'world' });}
});
The onRequest hook triggers upon receiving a request, while the onResponse hook activates when a response is sent back. Other hooks like preParsing, preValidation, preHandler, and preSerialization allow for more granular control over the request lifecycle.
Section 1.2: Utilizing Decorators
Decorators in Fastify provide a mechanism to enhance core Fastify objects, such as the request and reply objects. To implement a decorator, you could write:
const fastify = require('fastify')({});
fastify.decorateRequest('user', '');
fastify.addHook('preHandler', (req, reply, done) => {
req.user = 'jane smith';
done();
});
fastify.get('/', (req, reply) => {
reply.send(Hello, ${req.user}!);
});
In this example, we define a user property on the request object and set its value during the preHandler hook. Consequently, the response will return "Hello, jane smith!".
Chapter 2: Adding Configuration with Decorators
Fastify also allows you to add custom properties to the server instance, enhancing its functionality. For example:
const fastify = require('fastify')({});
fastify.decorate('conf', {
db: 'some.db',
port: 3000
});
fastify.get('/', (req, reply) => {
reply.send(Hello ${fastify.conf.db});
});
Here, we've added a conf property to the Fastify instance. This property can be accessed throughout your application, allowing for flexible configuration management. The response will yield "Hello some.db".
The video titled "Learn Just Enough Fastify to be Productive" provides an overview of Fastify and showcases practical implementations of its features.
Conclusion
In summary, Fastify enables developers to enrich their applications by using decorators for adding data to the Fastify instance or requests, as well as incorporating hooks at the route level for enhanced control over the request lifecycle.