2016-07-10 12 views
7

So habe ich den folgenden Code in meiner server.js-Datei, die ich mit node.js ausgeführt werde. Ich verwende Express, um HTTP-Anfragen zu bearbeiten.Express.js POST req.body leer

app.post('/api/destinations', function (req, res) { 
    var new_destination = req.body; 
    console.log(req.body); 
    console.log(req.headers); 
    db.Destination.create(new_destination, function(err, destination){ 
    if (err){ 
     res.send("Error: "+err); 
    } 
    res.json(destination); 
    }); 
}); 

ich die folgende im Terminal läuft:

curl -XPOST -H "Content-Type: application/json" -d '{"location": "New York","haveBeen": true,"rating": 4}' http://localhost:3000/api/destinations 

Danach server.js druckt die folgenden ausgeführt wird.

{} 
{ host: 'localhost:3000', 
    'user-agent': 'curl/7.43.0', 
    accept: '*/*', 
    'content-type': 'application/json', 
    'content-length': '53' } 

So ist req.body {}. Ich habe andere Stack Overflow-Posts zu ähnlichen Problemen gelesen, bei denen der Inhaltstyp aufgrund des Body-Parsers nicht korrekt war. Aber das ist nicht das Problem, weil der Inhaltstyp application/json ist.

Irgendwelche Ideen, wie man den tatsächlichen Körper der Anfrage erhält?

Vielen Dank im Voraus.

+0

Sie verwenden die Body-Parser-Middleware, richtig? – Cristy

+0

Und wenn Sie sind: wie, genau? – robertklep

+0

Ich benutze Body-Parser. Im Grunde benötigt es dann nur "app.use (bodyParser.urlencoded ({extended: true}));" ohne die Zitate natürlich. –

Antwort

16

Sie benötigen bodyParser.json auch:

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

Das hat funktioniert. Vielen Dank!! Ich kann nicht glauben, dass ich das vergessen habe. –

+2

Danke! Nicht sicher warum, aber wenn ich 'app.use (bodyParser.json()) versuchte; 'nach dem Lesen Ihres Kommentars, es hat funktioniert, auch wenn ich es schon oft ausprobiert habe. Muss eine magische Antwort sein;) – TetraDev

+5

Ich habe immer noch einen leeren Körper, obwohl beide Zeilen enthalten sind. Nicht sicher warum. – Micrified

5

die req.body zeigt Manchmal {}, wenn Sie den Namen Attribut auf die Formulareingabefelder zu setzen vergessen. Es folgt ein Beispiel:

<input type="email" name="myemail" class="form-control" id="exampleInputEmail2" placeholder="Email address" required> 

Dann wird die req.body zeigt { myemail: '[email protected]' }

ich diese Antwort schreiben, weil ich das ähnliche Problem und das war für mich gestoßen.

+0

Ich frage mich, warum der Body-Parser nur mit "name" -Attributen in Eingaben arbeitet, nicht nur "id". Diese Antwort hilft mir sehr, manchmal haben wir einfach diese grundlegenden Dinge vergessen. Ps: In .NET, I habe nie Namen in Eingabefeldern benutzt, also war das für mich ungewöhnlich. –