web-dev-qa-db-fra.com

Consignation de toutes les demandes dans Node.js / Express

Dans ma petite application node.js, en utilisant express, je voulais enregistrer toutes les demandes entrantes, donc je me suis retrouvé avec ceci:

var bodyParser = require('body-parser');

module.exports = function(app) {
   app.set("port", 50001);
   app.set("json spaces", 2);
   app.use(bodyParser.json());
   app.use(function (error, req, res, next) {
      app.logger.info("received from "+req.get("X-Forwarded-For")+" : "+req.method+" "+req.originalUrl+" (Authorization: "+req.get("Authorization")+")");
      //does not work if json is malformed
      //app.logger.info("content :"+JSON.stringify(req.body));
      if (error /*instanceof SyntaxError*/) {
         res.status(400);
         app.logger.error(error);
         res.json({ error:{msg: error.message}});
      } else {
         next();
      }
   });
   app.use(app.auth.initialize());
};

Malheureusement, je ne reçois les journaux que via le app.logger.info ligne lorsqu'il y a une erreur (dans mon cas, une chaîne JSON mal formée dans le corps). Qu'est-ce que j'oublie ici?

6
Julien

Expressjs adapte ses fonctionnalités en fonction du type de rappel que vous lui donnez (ce n'est pas courant dans les bibliothèques JS, il n'est donc pas surprenant que les gens s'y perdent).

Si vous faites cela lorsque votre rappel a quatre arguments:

app.use(function(error, req, res, next) {...});

puis Express suppose qu'il s'agit d'un gestionnaire de middleware contenant uniquement des erreurs et ne sera appelé qu'en cas d'erreurs. Dans le document express , voir la section intitulée Middleware de gestion des erreurs. Notez cette partie spécifique de cette page:

Définissez les fonctions middleware de gestion des erreurs de la même manière que les autres fonctions middleware, sauf avec quatre arguments au lieu de trois, spécifiquement avec la signature (err, req, res, next)):

Et, voici une section entière de la documentation consacrée à middleware de gestion des erreurs .

Si vous utilisez seulement trois arguments:

app.use(function(req, res, next) {...});

ensuite, c'est un middleware normal qui est appelé lorsqu'il n'y a pas d'erreurs. Je ne sais pas s'ils fournissent un seul moyen d'obtenir les deux. Mais, certainement comme solution de contournement, vous pouvez mettre votre code de journalisation dans une fonction, puis appeler cette fonction à partir de deux gestionnaires de middleware distincts, l'un pour les erreurs et l'autre pour les non-erreurs.

20
jfriend00