13 votes

Attraper les données POST JSON illégales dans Express ?

Lors de la création d'une demande POST avec du JSON valide, le bodyParser analyse correctement le corps de la demande POST. Cependant, si je soumets une chaîne JSON invalide comme corps, je reçois l'erreur :

SyntaxError: Unexpected token ILLEGAL
at parse (native)
at IncomingMessage.<anonymous>(/home/.../middleware/bodyParser.js:69:15)
...

Il semble donc que l'analyseur de corps échoue lors de l'analyse du corps. Cependant, j'aimerais détecter cet échec et renvoyer une erreur. Je ne suis pas sûr de ce que je peux faire pour l'attraper, donc toute aide serait appréciée. Merci.

2voto

Peter Lyons Points 47794

C'est dans le middleware bodyParser connect.js . Il FAIT un try/catch et appelle ensuite next(err). Vous devriez être en mesure d'attraper cette erreur et de la traiter avec du code personnalisé supplémentaire en utilisant l'attribut app.error() crochet de rappel. http://expressjs.com/guide.html#error-handling

1voto

timoxley Points 1973

Pour une raison quelconque, lorsque vous utilisez express/connect, JSON.parse ne lève pas les exceptions, ce qui explique pourquoi votre gestionnaire d'erreurs ne se déclenche pas.

J'ai a enregistré un problème avec express pour découvrir ce qui se passe, mais en attendant, vous pouvez utiliser cette solution de contournement :

express.bodyParser.parse['application/json'] = function(data) {
  var result = JSON.parse(data)
  if (typeof result != 'object') {
    throw new Error('Problems parsing JSON')
  }
  return result;
}
app.use(express.bodyParser());

mise à jour : ce problème n'est pas familier à l'auteur d'express, donc je me demande si ce n'est pas une autre bibliothèque qui le cause. Je vais devoir démonter mon code morceau par morceau pour trouver où ce comportement a été introduit.

1voto

Perki Points 126

Essayez de mettre votre

app.use(express.bodyParser()) ; après app.use(express.errorHandler(...))

a résolu le problème pour moi.

Vous pouvez également adapter le code suivant pour gérer l'erreur

express.bodyParser.parse['application/json'] = function(req, options, fn){
  var buf = '';
  req.setEncoding('utf8');
  req.on('data', function(chunk){ buf += chunk });
  req.on('end', function(){
  try {
    req.body = buf.length
      ? JSON.parse(buf)
      : {};
    fn();
  } catch (err){
    fn(new Error('Problems parsing JSON'));
  }
 });
};

0voto

Vodbro Points 1

BodyParser doit être au-dessus de app.use(app.router), l'emplacement relatif du gestionnaire d'erreur n'a pas d'importance comme Perki.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X