2013-02-23 13 views
6

Sto cercando di ottenere i valori che sto inviando per un post ajax nella mia applicazione di nodo. Utilizzando this post come guida, ho questo finora:Lettura delle variabili di post AJAX in Node.JS (con Express)

In Node:

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.stringify({response:'json'}) }); 
}); 

app.listen(3000); 

Sul lato 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'); 
       }, 
       }); 
     }) 

Questo problema è che non riesco a req.body .id (e qualsiasi altro valore come titolo o contenuto), sto ricevendo questo errore nel nodo:

TypeError: Cannot read property 'id' of undefined 

Se commento thos e chiama, però, l'ajax ha successo. Mi sono perso. Sto dimenticando qualcosa?

+0

ho lo stesso problema - prova Usa 'param ('postVariableName') ' – fider

risposta

7

L'oggetto req non è presente nella proprietà body. Date un'occhiata a http://expressjs.com/api.html#req.body:

Questa proprietà è un oggetto contenente il corpo della richiesta analizzata. Questa funzione è fornita dal middleware bodyParser(), sebbene il middleware di analisi di altri corpi possa seguire anche questa convenzione. Questa proprietà imposta automaticamente {} quando viene utilizzato bodyParser().

Quindi, è necessario aggiungere il middleware bodyParser al vostro webapp espresso in questo modo:

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

Ah, sapevo che mi mancava qualcosa di importante! Tuttavia, quando includo questo ho iniziato a ricevere una risposta "Richiesta non valida: Richiesta non valida". Questo è collegato in alcun modo? Devo installare questo tramite npm? – streetlight

+0

@streetlight: non penso che tu debba installare nulla, ma non so cosa potrebbe causare quell'errore. – thejh

+0

Ahh okay, grazie per il tuo aiuto! Non c'è quasi nulla in questa app, quindi non ho idea di cosa stia succedendo con questa cattiva richiesta! – streetlight

6

Il problema è stato infatti risolto includendo il middleware bodyParser come suggerito da thejh.

Basta fare in modo di visitare l'URL fornito in quella risposta da visitare espresso specifica aggiornamento: http://expressjs.com/api.html#req.body

La documentazione fornisce questo esempio (espresso 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); 
}) 

per questo al lavoro il modulo corpo-parser ha bisogno di essere installato separatamente:

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