Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Decoradores JS: Desarrollo web

Los decoradores en Fastify son un mecanismo poderoso que permite extender la funcionalidad de la aplicación con un mínimo de gastos. Técnicamente, los decoradores son funciones que agregan lógica adicional a las rutas o a la aplicación en sí. Son necesarios para la comodidad y la eficiencia del trabajo con la aplicación, así como para simplificar el proceso de desarrollo.

Hay muchos decoradores en Fastify. En esta lección, solo revisaremos algunos de los más populares. El conocimiento adquirido será aplicable a cualquier otro decorador.

Decorate

Uno de los decoradores más utilizados en Fastify es el decorate. Se utiliza para añadir nuevos métodos y propiedades al objeto de la aplicación. Vamos a ver un ejemplo:

import fastify from 'fastify';

const app = fastify();

// añadimos un nuevo método al objeto request
app.decorate('getData', () => {
  return { message: 'Hello World' };
});

// uso del nuevo método
app.get('/', (req, res) => {
  res.send(app.getData());
});

app.listen({ port: 3000 }, () => {
  console.log('El servidor está corriendo en el puerto 3000');
});

En el ejemplo anterior, añadimos en la propiedad getData una función que devuelve el objeto { message: 'Hello World' }. Ahora este método se puede llamar en cualquier manejador.

Decorate Request/Reply

Los decoradores decorateRequest() y decorateReply() permiten modificar los objetos de solicitud y respuesta, respectivamente. Permiten añadir propiedades o métodos a estos objetos.

import fastify from 'fastify';

const app = fastify();

app.decorateRequest('util', function () {
  // alguna lógica 
  // el objeto this es request
});

app.decorateReply('render', function () {
  // alguna lógica 
  // el objeto this es response
});

app.get('/', (req, res) => {
  req.util(); // llamada del método del decorador para el objeto request
  res.render(); // llamada del método del decorador para el objeto response
});

En el ejemplo anterior, creamos dos métodos util() para el objeto request y render() para el objeto response. Note que en los decoradores se utiliza function. Esto es necesario para mantener el contexto de los objetos para los cuales creamos los métodos.

Este enfoque permite crear una lógica generalizada donde se necesitan estos objetos.

Hooks

Otro decorador útil son los hooks. Permiten agregar interceptores (hooks) a las rutas o a la aplicación para realizar acciones adicionales antes o después de realizar una acción. Vamos a ver un ejemplo:

import fastify from 'fastify';

const app = fastify();

// agregamos un interceptor antes de procesar la petición
app.addHook('preHandler', (req, res, next) => {
  console.log(`La solicitud se realizó en ${new Date()}`);
  next();
});

app.get('/', (req, res) => {
  res.send({ message: 'Hello World' });
});

app.listen(3000, () => {
  console.log('El servidor está corriendo en el puerto 3000');
});

Arriba, con el hook preHandler añadimos una función que registra el tiempo de la petición. Ahora, con cada petición, se grabará en el registro una entrada como "La solicitud se realizó en 2024-05-03T11:38:20.946Z". El hook funciona de manera similar a los middleware.

En Fastify hay muchos hooks para diferentes acciones. En general, se pueden dividir en dos grupos:

  • Hooks de solicitud: se disparan durante el evento de solicitud o respuesta.
  • Hooks de aplicación: estos hooks se disparan durante algunos eventos de la aplicación misma, por ejemplo, cuando se añade un manejador de ruta.

Hooks de solicitud

A continuación, se presenta una lista de estos hooks junto con ejemplos de uso:

  • onRequest — se ejecuta antes de procesar la solicitud.
app.addHook('onRequest', (req, res, done) => {
  console.log(`La solicitud se realizó en ${new Date()}`);
  done();
});
  • preParsing — se ejecuta antes de que se lea el cuerpo de la solicitud.
app.addHook('preParsing', (req, res, done) => {
  console.log('Analizando el cuerpo de la solicitud');
  done();
});
  • preValidation — se ejecuta antes de validar la solicitud.
app.addHook('preValidation', (req, res, done) => {
  console.log('Validando solicitud');
  done();
});
  • preHandler — se ejecuta antes de manejar la ruta.
app.addHook('preHandler', (req, res, done) => {
  console.log('Ejecutando hook preHandler');
  done();
});
  • preSerialization — se realiza antes de formar la respuesta.
app.addHook('preSerialization', (req, res, payload, done) => {
  console.log('Preparando la respuesta para la serialización');
  done(null, { respuestaPersonalizada: payload });
});

Estos hooks permiten realizar acciones adicionales en diversas etapas del procesamiento de solicitudes. Esto puede ser útil para tareas como el registro, la autenticación, la validación de datos y otras funciones relacionadas.

Hooks de aplicación

Aquí están algunos hooks de la aplicación:

  • onRoute — se activa cuando se añade un manejador de ruta..
app.addHook('onRoute', (routeOptions) => {
  console.log('Se agregó una ruta:', routeOptions.path);
});

app.get('/', (req, res) => { // se llamará a la función que agregamos en el hook onRoute
  res.send({ message: 'Hello World' });
});
  • onClose — se activa antes de cerrar la aplicación.
app.addHook('onClose', (instance, done) => {
  console.log('Cerrando la aplicación');
  done();
});
  • onReady — se ejecuta después de completar el registro de todas las rutas, plugins y cuando la aplicación está lista para funcionar.
app.addHook('onReady', () => {
  console.log('La aplicación está lista');
});
  • onError — se activa cuando ocurre un error.
app.addHook('onError', (error, instance) => {
  console.error('Error durante la ejecución del hook:', error.message);
});

Estos hooks de aplicación permiten llevar a cabo acciones adicionales en varios escenarios del ciclo de vida de la aplicación Fastify, como el manejo de rutas, el registro de plugins, el cierre de la aplicación y la gestión de errores.

Los ejemplos anteriores demuestran el uso básico de decoradores en Fastify. Ayudan a hacer que el código sea más limpio, modular y fácil de desarrollar y mantener. Solo hemos revisado una parte de los decoradores. Puedes ver la lista completa en la documentación. Pero los que ya hemos revisado en la lección pueden ser suficientes para la mayoría de las tareas.

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY