Lecture des variables de poste AJAX dans Node.JS (avec Express)

J’essaie d’obtenir les valeurs que j’envoie pour un message ajax dans mon application de noeud. En utilisant ce post comme guide, j’ai ceci jusqu’à présent:

Dans le noeud:

var express = require('express'); var app = express(); var db = require('./db'); app.get('/sender', function(req, res) { res.sendfile('public/send.html'); }); app.post('/send_save', function(req, res) { console.log(req.body.id) console.log(req.body.title); console.log(req.body.content); res.contentType('json'); res.send({ some: JSON.ssortingngify({response:'json'}) }); }); app.listen(3000); 

Du côté AJAX:

 $('#submit').click(function() { alert('clicked') console.log($('#guid').val()) console.log($('#page_title').val()) console.log($('#page-content').val()) $.ajax({ url: "/send_save", type: "POST", dataType: "json", data: { id: $('#guid').val(), title: $('#page_title').val(), content: $('#page-content').val() }, contentType: "application/json", cache: false, timeout: 5000, complete: function() { //called when complete console.log('process complete'); }, success: function(data) { console.log(data); console.log('process sucess'); }, error: function() { console.log('process error'); }, }); }) 

Ce problème est que je ne peux pas req.body.id (et toute autre valeur comme titre ou contenu), je reçois cette erreur dans le noeud:

  TypeError: Cannot read property 'id' of undefined 

Si je commente ces appels cependant, le ajax est réussi. Je suis perdu. Est-ce que j’oublie quelque chose?

L’object req vous avez là n’a pas de propriété body . Jetez un coup d’œil sur http://expressjs.com/api.html#req.body :

Cette propriété est un object contenant le corps de la requête analysée. Cette fonctionnalité est fournie par le middleware bodyParser (), bien que d’autres middleware d’parsing corporelle puissent également suivre cette convention. La valeur par défaut de cette propriété est {} lorsque bodyParser () est utilisé.

Donc, vous devez append le middleware bodyParser à votre application web express comme ceci:

 var app = express(); app.use(express.bodyParser()); 

Le problème a bien été résolu en incluant le middleware bodyParser comme suggéré par thejh.

Assurez-vous simplement de consulter l’URL fournie dans cette réponse pour consulter la spécification mise à jour Express: http://expressjs.com/api.html#req.body

La documentation fournit cet exemple (Express 4.x):

 var app = require('express')(); var bodyParser = require('body-parser'); var multer = require('multer'); app.use(bodyParser.json()); // for parsing application/json app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded app.use(multer()); // for parsing multipart/form-data app.post('/', function (req, res) { console.log(req.body); res.json(req.body); }) 

Pour que cela fonctionne, le module body-parser doit être installé séparément:

https://www.npmjs.com/package/body-parser