Corps de la requête Express.js __proto__

J’ai un petit problème avec request.body généré par le middleware express.urlencoded (). Dans certains cas, il ajoute __proto__ à la fin de l’object request.body et ne peut donc pas être utilisé directement pour lancer un modèle moongose, de la sorte, ainsi var user = new User(req.body)

Par exemple, je vais utiliser le référentiel node-express-mongoose-demo . Tous les formulaires fonctionnent très bien, mais app.post('/users', users.create) reçoit req.body “polluted” avec __proto__

Merci d’avance pour votre aide

Il semble que le problème vienne du middleware urlencoded url, celui fourni avec Express 3 .

Une solution possible consiste à ne pas utiliser Express bodyParser, mais le module d’ body-parser .

Au lieu de

 app.use(express.urlencoded()) 

tu peux écrire

 var bodyparser = require('body-parser') .......... app.use(bodyparser.urlencoded()) 

Le problème semble provenir du module qs (la version utilisée par le module express 3 ). Il oblige à append un __proto__ sur les objects qu’il construit. La dernière version n’a pas ce problème.

Hmm, c’est intéressant. __proto__ est une propriété spéciale / automatic / internal sur tous les objects de certaines implémentations JavaScript, y compris node / v8. Je n’ai pas vu de mongoose faire ce genre de chose cependant. Le code permettant de convertir les atsortingbuts transmis à un constructeur de modèle en instance de modèle / document est ici . Je ne vois cependant rien de suspect.

Savez-vous exactement dans quels cas cela se produit et êtes-vous sûr que c’est urlencoded en urlencoded ? Que se passe-t-il lorsque vous essayez de sauvegarder un utilisateur qui a été “pollué” avec cela? Normalement, les mongooses ignorent simplement les champs qui ne sont pas définis dans le schéma, alors que se passe-t-il?

Vous devriez pouvoir (peut-être?) Contourner ce problème avec un middleware comme ci-dessous, mais je suis curieux de vraiment isoler et comprendre la cause fondamentale. underscore / lodash a omit ce qui fonctionne bien ici.

 var _ = require('lodash'); function unpollute(req, res, next) { req.body = _.omit(req.body, '__proto__'); next(); } app.use(express.urlencoded()); app.use(unpollute); 

Ensuite, lorsque votre gestionnaire d’itinéraire sera exécuté, req.body n’aura pas __proto__ .