errorHandler

Overview

services/api/src/middlewares/errorHandler.js define una función de middleware para manejo de errores HTTP. Su trabajo es normalizar la respuesta de error y devolver siempre un JSON consistente.

La función toma un objeto de error, calcula un código de estado, construye un mensaje y responde al cliente. Cuando el error es de servidor, también lo registra en consola.

[!NOTE] El archivo exporta una sola función: errorHandler.

How it works

flowchart TB
    E[err] --> S[statusCode from err statusCode or 500]
    E --> M[message from err message or Error interno del servidor]
    S --> D{statusCode 500 or greater}
    D -->|yes| L[console error]
    D -->|no| R[res status json]
    L --> R
    M --> R

La función recibe err, _req, res y _next. Luego calcula statusCode y message con valores por defecto. Si el código es 500 o superior, imprime el error completo. Después responde con res.status(statusCode).json(...).

{
    "title": "errorHandler",
    "content": "Funci\u00f3n p\u00fablica de middleware en services/api/src/middlewares/errorHandler.js. Convierte errores en respuestas JSON y registra errores de servidor.",
    "type": "function",
    "filePath": "services/api/src/middlewares/errorHandler.js",
    "badges": [
        "public"
    ]
}

Data & fields

[
    {
        "name": "err",
        "type": "object",
        "required": true,
        "description": "Objeto de error de entrada. La función lee statusCode, message, code, field y details."
    },
    {
        "name": "_req",
        "type": "object",
        "description": "Solicitud HTTP recibida. Se recibe, pero no se usa en esta implementación."
    },
    {
        "name": "res",
        "type": "object",
        "required": true,
        "description": "Respuesta HTTP. La función usa status y json para enviar el error al cliente."
    },
    {
        "name": "_next",
        "type": "function",
        "description": "Siguiente middleware. Se recibe, pero no se usa en esta implementación."
    },
    {
        "name": "statusCode",
        "type": "number",
        "description": "Valor leído desde err.statusCode. Si no existe, usa 500."
    },
    {
        "name": "message",
        "type": "string",
        "description": "Mensaje leído desde err.message. Si no existe, usa 'Error interno del servidor'."
    },
    {
        "name": "code",
        "type": "string | null",
        "description": "Campo incluido en la respuesta JSON. Usa err.code o null."
    },
    {
        "name": "field",
        "type": "string | null",
        "description": "Campo incluido en la respuesta JSON. Usa err.field o null."
    },
    {
        "name": "details",
        "type": "any | null",
        "description": "Campo incluido en la respuesta JSON. Usa err.details o null."
    }
]

La función responde con un objeto que contiene estos campos:

  • error: mensaje de error.
  • code: código de error o null.
  • field: nombre del campo o null.
  • details: detalles adicionales o null.
{
  "error": "Mensaje de error",
  "code": null,
  "field": null,
  "details": null
}

Behaviors

  • errorHandler — calcula el statusCode con err.statusCode o 500.
  • errorHandler — calcula el message con err.message o el texto por defecto.
  • errorHandler — registra el error con console.error(err) cuando el código es 500 o mayor.
  • errorHandler — responde con JSON usando res.status(statusCode).json(...).
  • errorHandler — expone code, field y details en la respuesta si existen.

Workflows

sequenceDiagram
    participant A as Application
    participant H as errorHandler
    participant C as Console
    participant R as Response

    A->>H: err req res next
    H->>H: calcula statusCode y message
    alt statusCode 500 or greater
        H->>C: console error
    end
    H->>R: status json

El flujo es directo y determinista. Primero normaliza el error. Luego decide si debe registrarlo. Finalmente responde al cliente con JSON.

Gotchas & edge cases

[!WARNING] Si err.statusCode no existe, la función usa 500. Eso activa el registro con console.error(err).

[!NOTE] details usa el operador ??. Si err.details es undefined o null, la respuesta enviará null.

[!NOTE] _req y _next se reciben por compatibilidad con middleware HTTP. Esta implementación no los utiliza.

Esta función pertenece a la capa de middleware de services/api. Su salida está pensada para cualquier parte del backend que entregue errores al ciclo HTTP.

El diseño refleja un contrato de error uniforme para respuestas JSON. Eso facilita que el cliente reciba siempre error, code, field y details.