Skip to content

Middlewares Nativos

Los middlewares en Fang JS siguen el Onion Model (Modelo de Cebolla). Esto permite ejecutar lógica antes de llegar a la ruta y después de que esta termine. Fang incluye tres middlewares fundamentales listos para usar.


El middleware de cors gestiona las cabeceras de seguridad para permitir peticiones desde otros dominios y maneja automáticamente las peticiones OPTIONS (pre-flight).

import { cors } from "@fang-js/fang/middlewares";
import { methods } from "@fang-js/fang/types";
app.use(
cors({
origin: "http://127.0.0.1:5500",
methods: [methods.GET, methods.POST, methods.PUT, methods.DELETE],
}),
);
OpciónDescripción
originString, Array o ”*” para permitir dominios.
methodsMétodos HTTP permitidos (Default: todos).
allowedHeadersCabeceras personalizadas permitidas.
credentialsHabilita el envío de cookies y cabeceras de auth.

Este middleware valida la presencia y la firma de un JSON Web Token en la cabecera Authorization: Bearer <token>. Si el token es válido, inyecta los datos del usuario en ctx.state.user.

import { auth } from "@fang-js/fang/middlewares";
// Aplicar a un grupo de rutas protegidas
const admin = app.group("/admin");
admin.use(auth(process.env.JWT_SECRET));
admin.get("/dashboard", (ctx) => {
const user = ctx.state.user; // Datos decodificados del JWT
return ctx.ok({ welcome: user.username });
});

Sirve archivos (imágenes, CSS, JS, etc.) desde un directorio local. Incluye un MIME_MAP interno muy completo y manejo de caché por defecto (1 día).

import { serveStatic } from "@fang-js/fang";
app.use(
serveStatic("public", "/static", (ctx) => {
ctx.notFound({ error: "Archivo no encontrado" });
}),
);
  1. rootDir: Carpeta local (ej: “public”).

  2. prefix: Prefijo en la URL para interceptar (ej: “/static”).

  3. onError: Callback personalizado si el archivo no existe o hay un error de acceso.

Puedes crear tus propios middlewares fácilmente. Solo recuerda usar await next() para no romper la cadena.

import type { Middleware } from "@fang-js/fang/types";
export const loggerMiddleware: Middleware = async (ctx, next) => {
const start = Date.now();
await next();
console.log(`${ctx.req.method} - ${Date.now() - start}ms`);
};
  1. Globales: app.use(myMiddleware) (Afecta a toda la app).
  2. Por Grupo: group.use(myMiddleware) (Afecta a las rutas del grupo).
  3. Por Ruta: app.get(“/ruta”, myMiddleware, (ctx) => …) (Solo esa ruta).