Implementación de detección de versión basada en encabezados en NestJS: Usando Middleware
- 584Palabras
- 3Minutos
- 14 Sep, 2024
En el artículo anterior “Implementación de detección de versión basada en encabezados en NestJS: Usando Interceptor”, presentamos cómo usar interceptores para realizar la detección de versiones.
Este artículo muestra cómo implementar esta misma funcionalidad usando middleware.
Análisis de requerimientos
El requerimiento es simple: en cada solicitud, el encabezado debe incluir la versión del cliente, y el servidor debe verificarla. Si la versión es inferior a la requerida por el servidor, se debe adjuntar un campo que sugiera una actualización; si la versión es correcta, los datos se devuelven sin modificaciones.
Cómo implementarlo
En NestJS, podemos usar middleware para capturar las solicitudes y modificar las respuestas. En el middleware podemos:
- Obtener la información de la versión del encabezado.
- Determinar si la versión necesita actualización, comparando versiones.
- Modificar los datos de respuesta si es necesario, añadiendo un campo adicional.
1. Crear el middleware de detección de versión
El middleware en NestJS es una herramienta para intervenir en el ciclo de vida de la solicitud. En este caso, necesitamos crear un middleware que detecte la versión y modifique la respuesta antes de enviarla al cliente.
1import { Injectable, NestMiddleware } from "@nestjs/common";2import { Request, Response, NextFunction } from "express";3
4@Injectable()5export class VersionMiddleware implements NestMiddleware {6 private readonly latestVersion = "2.0.0"; // Establecer la versión más reciente7
8 use(req: Request, res: Response, next: NextFunction) {9 const version = req.headers["version"] as string; // Obtener la versión del encabezado10
11 res.on("finish", () => {12 if (version && this.needsUpdate(version)) {13 // Si se necesita una actualización, modificar la respuesta14 const originalSend = res.send;15 res.send = (body: any) => {16 let modifiedBody = body;17 try {18 modifiedBody = JSON.parse(body);19 } catch (err) {}20
21 const updateInfo = {22 updateAvailable: true,23 updateUrl: "xxxx", // URL de actualización24 latestVersion: this.latestVersion,25 message: "Hay una nueva versión disponible, por favor actualice.",26 };27
28 const updatedBody = { ...modifiedBody, ...updateInfo };29 return originalSend.call(res, JSON.stringify(updatedBody));30 };31 }32 });33
34 next();35 }36
37 // Lógica para comparar versiones38 private needsUpdate(clientVersion: string): boolean {39 return clientVersion < this.latestVersion;40 }41}
En este middleware, obtenemos la versión del cliente mediante req.headers['version']
y llamamos al método needsUpdate
para comparar versiones. Si el cliente tiene una versión antigua, modificamos la respuesta antes de enviarla, añadiendo el campo updateAvailable
.
2. Aplicar el middleware
En NestJS, podemos registrar el middleware en main.ts
o app.module.ts
.
Registro en app.module.ts
1import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common";2import { AppController } from "./app.controller";3import { VersionMiddleware } from "./version.middleware";4
5@Module({6 controllers: [AppController],7})8export class AppModule implements NestModule {9 configure(consumer: MiddlewareConsumer) {10 consumer.apply(VersionMiddleware).forRoutes("*"); // Aplicar middleware a todas las rutas11 }12}
3. Probar la API
Después de configurar el middleware, podemos probar la API usando curl
o Postman. El cliente enviará la versión en el encabezado y el servidor responderá en función de la versión.
Ejemplo de solicitud
1curl -X GET http://localhost:3000/api/data -H "version: 1.0.0"
Ejemplo de respuesta (si es necesaria la actualización)
1{2 "data": "Aquí están tus datos",3 "updateAvailable": true,4 "latestVersion": "2.0.0",5 "message": "Hay una nueva versión disponible, por favor actualice."6}
Ejemplo de respuesta (si no es necesaria la actualización)
1{2 "data": "Aquí están tus datos"3}
Conclusión
El middleware es una herramienta flexible y eficiente que permite manejar la detección de versiones sin modificar la lógica de negocio. De esta forma, podemos agregar control de versiones a todas las solicitudes de API, asegurando que los clientes con versiones antiguas reciban un aviso de actualización, mejorando así la experiencia del usuario. Este método no solo es útil para el control de versiones, sino también para otros escenarios que requieren procesamiento entre la solicitud y la respuesta, como el registro de logs o la verificación de permisos.