NutriTrack SaaS — Backend API · Node.js 18 + TypeScript
catch {} sin cuerpo: cualquier fallo de sendEmail o de Redis queda completamente silenciado. El sistema cree que los recordatorios se enviaron cuando en realidad fallaron.patientId y email. Añadir métrica de tasa de fallos y alertar si supera el 10% en un lote.stripe.charges.create lanza una excepción (tarjeta rechazada, timeout, límite de rate), el error queda convertido en null. No hay log, no se notifica al admin, no se registra el intento fallido en la BD.payment_failures, loguear con contexto completo, notificar al equipo financiero por Slack/email y re-lanzar la excepción para que el job scheduler pueda hacer retry con backoff exponencial.JSON.parse(null) lanza excepción porque redis.get devuelve null en cache miss. El catch silencia esto y deja cachedData = []. Si Redis está caído, nunca hay error visible.raw === null) de error de parsing. Loguear JSON corrupto en Redis como warning e invalidar la clave. Si Redis lanza error de conexión, registrar como error de infraestructura.redis.set(...) sin await ni .catch(). Una promesa rechazada sin manejar provoca UnhandledPromiseRejection en Node.js, que en versiones recientes termina el proceso..catch() para absorber el error sin romper el flujo. Añadir TTL explícito (recomendado: 300 s) para evitar datos obsoletos indefinidamente.console.log('Error saving meal') sin incluir el objeto err, el patientId ni el payload. Se pierde el stack trace y cualquier contexto de diagnóstico.error, incluyendo el error completo, el patientId y los campos del payload (omitiendo datos sensibles si aplica).Pool de pg no tiene connectionTimeoutMillis, idleTimeoutMillis ni statement_timeout. El evento pool.on('error') no está registrado.connectionTimeoutMillis: 3000, idleTimeoutMillis: 30000 y statement_timeout: 10000. Registrar pool.on('error') para capturar errores de cliente inactivo sin romper el proceso..catch(() => {}) traga el error de invalidación de caché sin registrarlo. Si Redis está caído, los pacientes ven datos obsoletos pero no hay ninguna señal.warn con contexto del patientId. Si el patrón de fallos se repite, activar alerta de salud de Redis.| # | Archivo | Tipo de fallo | Severidad | Patrón detectado |
|---|---|---|---|---|
| F-001 | reminderService.ts:9 | Empty Catch | Crítico | catch {} — traga errores email + Redis |
| F-002 | paymentService.ts:15 | Fallback peligroso | Crítico | chargeResult = null — oculta fallo Stripe |
| F-003 | patientRoutes.ts:12 | Empty Catch | Crítico | JSON.parse(null) con catch mudo |
| F-004 | patientRoutes.ts:28 | Async incorrecto | Alto | Fire-and-forget sin .catch() — posible crash |
| F-005 | patientRoutes.ts:42 | Logging insuf. | Alto | console.log sin err ni contexto |
| F-006 | lib/db.ts:4 | Sin timeout | Medio | Pool sin timeouts ni on('error') |
| F-007 | patientRoutes.ts:36 | Async incorrecto | Medio | .catch(() => {}) sin log |
payment_failures, notificación Slack/email y retry con backoff exponencial. Estimación: 2 h.