All files / src/middleware errorHandler.js

92.3% Statements 12/13
78.94% Branches 15/19
100% Functions 1/1
92.3% Lines 12/13

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56                                4x               4x 4x       4x 4x           4x 4x       4x 4x       4x 4x       4x        
/**
 * Middleware de gestion centralisée des erreurs Express.
 *
 * Principe : ne JAMAIS exposer de détails internes au client.
 * Les erreurs SSH, DB, et internes sont loguées côté serveur
 * mais le client reçoit un message générique.
 *
 * @module middleware/errorHandler
 */
 
/**
 * Gestion centralisée des erreurs.
 * Classifie l'erreur et retourne un message adapté sans fuite d'information.
 */
function errorHandler(err, req, res, _next) {
  // Logger l'erreur complète côté serveur (pour le debug)
  console.error('[error]', {
    message: err.message,
    stack: process.env.NODE_ENV === 'production' ? undefined : err.stack,
    path: req.path,
    method: req.method,
  });
 
  // ─── Erreurs de validation (envoyées volontairement par nos routes) ──────
  Eif (err.type === 'validation') {
    return res.status(400).json({ error: err.message });
  }
 
  // ─── Erreurs SSH — message générique pour ne pas exposer l'infra ────────
  Eif (err.message && (err.message.includes('ssh') || err.message.includes('SSH'))) {
    return res.status(502).json({
      error: 'Erreur de connexion au serveur distant. Vérifiez la configuration SSH.',
    });
  }
 
  // ─── Erreur de payload trop grand ────────────────────────────────────────
  Eif (err.type === 'entity.too.large') {
    return res.status(413).json({ error: 'Requête trop volumineuse.' });
  }
 
  // ─── Erreur JSON mal formé ──────────────────────────────────────────────
  Eif (err.type === 'entity.parse.failed') {
    return res.status(400).json({ error: 'JSON invalide dans le corps de la requête.' });
  }
 
  // ─── Erreur générique — JAMAIS exposer err.message en production ────────
  const status = err.status || 500;
  const message = status === 500
    ? 'Erreur interne du serveur.'
    : (err.message || 'Erreur interne du serveur.');
 
  res.status(status).json({ error: message });
}
 
module.exports = { errorHandler };