Problème lors de la publication de données JSON (avec une demande de noeud) sur le serveur Express pour les enregistrer dans MongoDB

J’utilise MongoDB comme firebase database principale pour mon application de nœud / Express. Pour résumer le problème auquel je suis confronté, je ne sais pas comment configurer la configuration de l’parsingur de corps dans mon application Express, car l’application côté serveur ne reçoit pas l’intégralité du fichier JSON envoyé par l’application client ) Pour la plupart, le client envoie JSON dans le corps de la demande aux noeuds finaux RESTful. L’exception étant un cas où un fichier doit être téléchargé et puisqu’il s’agit d’un corps multipart, j’utilise request et form-data pour construire ce type de demande et j’utilise multer côté serveur pour traiter la demande multipart, car body -parser ne traite pas de telles demandes.

Sur le serveur (Express), j’ai la configuration suivante de l’application Express:

let app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); 

Sur le noeud client, j’utilise le code suivant pour créer un object JavaScript de style JSON et le publier sur un sharepoint terminaison RESTful:

J’ai des difficultés à composer la demande côté client, avec la demande de noeud :

 // class is a JavaScript/JSON object within scope of this code let req = request.post({ //headers: { 'Content-Type': 'application/json' }, url: 'http://localhost:3000/classes', //form: class form: JSON.ssortingngify(class) }, function (err, resp, body) { if (err) { throw err; } }); 

Notez que j’ai essayé plusieurs versions du code ci-dessus en spécifiant explicitement le type de contenu comme application/JSON , ainsi qu’en utilisant JSON.ssortingngify pour convertir l’object JavaScript en une chaîne JSON. La collection MongoDB ( class ) stocke le type de document suivant, qui contient les clés étrangères de deux autres collections ( subject et student ):

 { "_id" : ObjectId("57758f15f68da08c254ebee1"), "name" : "Grade 5 - Section A", "scores" : [{ "studentId" : ObjectId("5776bd36ffc8227405d364d2"), "performance": [{ "subjectId" : ObjectId("577694ecbf6f3a781759c54a"), "score" : 86, "maximum" : 100, "grade" : "B+" }] }] } 

L’erreur suivante apparaît dans les journaux du serveur:

 Tue, 05 Jul 2016 04:34:46 GMT classReportApp:routes:classes class received from client: { _id: 577b38e65967097c25876764, scores: [] } RangeError: Invalid status code: 0 at ServerResponse.writeHead (_http_server.js:192:11) at ServerResponse.writeHead (C:\Development\classReportApp\node_modules\morgan\node_modules\on-headers\index.js:55:19) at ServerResponse._implicitHeader (_http_server.js:157:8) at ServerResponse.OutgoingMessage.end (_http_outgoing.js:566:10) at ServerResponse.send (C:\Development\classReportApp\node_modules\express\lib\response.js:205:10) at ServerResponse.json (C:\Development\classReportApp\node_modules\express\lib\response.js:250:15) at C:\Development\classReportApp\server-process\app.js:80:26 at Layer.handle_error (C:\Development\classReportApp\node_modules\express\lib\router\layer.js:71:5) at sortingm_prefix (C:\Development\classReportApp\node_modules\express\lib\router\index.js:310:13) at C:\Development\classReportApp\node_modules\express\lib\router\index.js:280:7 at Function.process_params (C:\Development\classReportApp\node_modules\express\lib\router\index.js:330:12) 

ce qui est étrange car le tableau scores de sous-documents est vide ( scores: [] ), alors que côté client, j’envoie un tableau non vide contenant des éléments de performances de certains étudiants.

Ai-je violé le bon moyen de publier JSON sur des applications Express? Comment puis-je réparer ça?

Modifié le: 7/5/2016 J’ai changé la configuration du middleware de l’parsingur de corps pour utiliser plutôt extended: true

 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); 

Node.js utilise toujours le module node-request pour composer et envoyer la requête POST à ​​l’aide du code suivant:

 let req = request({ url: 'http://localhost:3000/classes', method: 'POST', json: class }, function (err, resp, body) { if (err) { throw err; } else { // process response } }); 

Cela fonctionne maintenant, mais ce qui me dérange, c’est que puisque le type de contenu est application / json, en quoi le bodyParser.urlencoded({ extended: true }) (ou false) est-il important?

Le problème est form: JSON.ssortingngify(class) à la form: JSON.ssortingngify(class) dans votre première demande. form prend une entrée de forme codée url, json ssortingngified ne fonctionnera pas. vérifier l’en-tête de type de contenu (application / x-www-form-urlencoded)

json: class dans votre deuxième extrait fonctionne comme ceci gère les données json et définit correctement l’en-tête de type de contenu.

Essayez la méthode .toJSON () sur la classe avant d’envoyer.