2014-12-15 2 views
6

Sono un principiante di nodejs, cerco di conoscere req.body utilizzando un middleware body-parse o usando niente, ma entrambi hanno trovato req.body non definito. Ecco il mio codiceNodejs - Req.body undefined in post con express 4.9.0

var app = require('express')();   
var bodyParser = require('body-parser'); 
var multer = require('multer');   

app.get('/', function(req, res) {  
    res.send("Hello world!\n");   
});          

app.post('/module', function(req, res) { 
    console.log(req);     
    app.use(bodyParser.json());   
    app.use(bodyParser.urlencoded({  
     extended: true     
    }));         
    app.use(multer);      
    console.log(req.body);    
});          

app.listen(3000);      

module.exports = app; 

E io uso il comando curl -X POST -d 'test case' http://127.0.0.1:3000/module per testarlo. Versione

di espresso: la versione 4.9.0
del nodo: v0.10.33

prega di aiuto, grazie.

+1

Penso bodyParser extects un JSON e 'test case' non è:/ – naoxink

+2

Spostare app.use (bodyParser.json()); (e il resto del middleware) dal gestore/post –

+0

Ho provato curl -X POST -d '{"nome": "tyrion"}' http://127.0.0.1:3000/module, ma ancora indefinito. – Tyrion

risposta

5

Per cURL predefinito utilizza Content-Type: application/x-www-form-urlencoded per l'invio di moduli che non contengono i file.

Per i moduli urlencoded, i dati devono essere nel formato corretto: curl -X POST -d 'foo=bar&baz=bla' http://127.0.0.1:3000/module o curl -X POST -d 'foo=bar' -d 'baz=bla' http://127.0.0.1:3000/module.

Per JSON, è necessario impostare in modo esplicito il codice Content-Type: curl -H "Content-Type: application/json" -d '{"foo":"bar","baz":"bla"}' http://127.0.0.1:3000/module.

Inoltre come noto @Brett, è necessario app.use() middleware prima quel post percorso da qualche parte (al di fuori di un gestore di percorso).

+0

Grazie mille, ho provato come dici tu, va bene. – Tyrion

5

Si sta posizionando la configurazione rapida per body-parser nella posizione errata.

var app = require('express')();   
var bodyParser = require('body-parser'); 
var multer = require('multer');   

// these statements config express to use these modules, and only need to be run once 
app.use(bodyParser.json());   
app.use(bodyParser.urlencoded({ extended: true }));         
app.use(multer); 

// set up your routes 
app.get('/', function(req, res) {  
    res.send("Hello world!\n");   
});          

app.post('/module', function(req, res) { 
    console.log(req);          
    console.log(req.body);    
});          

app.listen(3000);      

module.exports = app; 
+0

Grazie per il vostro aiuto, ho provato come mi avete detto, ma notando la stampa al terminatore, non so perché. – Tyrion

+1

Grazie per il tuo aiuto, ho trovato errore di codice, app.use (multer()). – Tyrion

1

È necessario assicurarsi di definire tutte le configurazioni espresse prima di definire i percorsi. come analista del corpo è responsabile per l'analisi del corpo di requst.

var express = require('express'), 
    app  = express(), 
    port = parseInt(process.env.PORT, 10) || 8080; 

//you can remove the app.configure at all in case of it is not supported 
//directly call the inner code  
app.configure(function(){ 
    app.use(bodyParser.urlencoded()); 
    //in case you are sending json objects 
    app.use(bodyParser.json()); 
    app.use(app.router); 
}); 

app.listen(port); 

app.post("/module", function(req, res) { 
    res.send(req.body); 
}); 
+0

Non c'è app.configure in express 4.9 – mako

+0

basta semplicemente rimuoverlo e disattivare il codice interno – msoliman