Skip to content

Manejo de Errores Globales en Strapi

Middleware.

Un middleware en Strapi es una función que se ejecuta durante el ciclo de vida de una solicitud HTTP. El middleware puede modificar la solicitud, la respuesta, o interrumpir el ciclo para devolver un error, entre otras cosas. Los middlewares son útiles para tareas como autenticación, logging, manejo de errores, y más.

Middleware para el Manejo de Errores Globales.

El middleware de manejo de errores globales es un tipo específico de middleware que se utiliza para capturar y manejar todos los errores que ocurren durante el ciclo de vida de una solicitud HTTP. Su función principal es garantizar que, cuando ocurra un error inesperado o no gestionado, este se maneje de manera consistente en toda la aplicación.

Características del Middleware de Manejo de Errores Globales:

  • Captura cualquier error lanzado durante la ejecución de una solicitud, incluso si el error no fue previsto.
  • Establece un formato unificado de respuesta para todos los errores capturados.
  • Permite registrar o reportar los errores a sistemas externos (por ejemplo, para monitoreo).
  • Generalmente se coloca al final de la pila de middlewares para que capture todos los errores que no hayan sido manejados previamente.

Crear un Middleware

Terminal window
npx strapi generate

El comando anterior deberia mostrar un menu de la siguente manera :

Terminal window
? Strapi Generators
content-type - Generate a content type for an API
plugin - Generate a basic plugin
policy - Generate a policy for an API
> middleware - Generate a middleware for an API
migration - Generate a migration
service - Generate a service for an API
api - Generate a basic API

En este caso, debemos escoger la opción de middleware. Usando las flechas para seleccionar dicha opción y con enter para ejecutarla. Lo que sigue es asignarle un nombre al middleware. Después nos aparecerá lo que es agregar el middleware, si es al archivo de root o a una API o plugin existentes. Ya que va a ser global y no específico, se asignará la primera opción:

Terminal window
? Where do you want to add this middleware?
Add middleware to root of project

Al terminar, se creará un archivo .js en el directorio de middlewares, en ese archivo se pega el siguiente código ./src/middlewares/error-handler.js :

// 'use strict';
// /**
// * `error-handler` middleware
// */
module.exports = (config, { strapi }) => {
return async (ctx, next) => {
try {
await next();
} catch (err) {
strapi.log.error("Error capturado por el middleware:", err);
ctx.status = err.status || 500;
ctx.body = {
message: err.message || "Ocurrió un error interno en el servidor.",
details: err.details || "Sin detalles adicionales.",
};
ctx.app.emit("error", err, ctx);
}
};
};

Después de copiar el anterior código, lo que se tiene que hacer es registrar el Middleware para que funcione globalmente y para eso se tiene que pegar el siguiente código en la ruta de ./config/middlewares.js:

module.exports = [
"strapi::logger",
"strapi::errors",
"strapi::security",
"strapi::cors",
"strapi::poweredBy",
"strapi::query",
"strapi::body",
"strapi::session",
"strapi::favicon",
"strapi::public",
"global::error-handler",
];

Si el error funciona de manera correcta, debería mostrar lo siguiente en la terminal:

Terminal window
[2024-08-12 22:40:20.832] error: Error capturado por el middleware: Este es un error de prueba.
Error: Este es un error de prueba.

Para probar el error, lo que se puede hacer es crear una API de prueba, donde el controlador tenga una parte donde genere un error intencionado y ahí es donde funciona el middleware. Al crear la API, también se debe configurar la ruta. Es importante mencionar que este es un middleware de manejo de errores globales, por lo cual a todos los errores mostrará el mismo error. También va a haber ocasiones en las que no muestre el mensaje, ya que Strapi maneja varios errores automáticamente y esos errores se procesan primero, por lo cual el middleware ya no los procesa.