web-dev-qa-db-de.com

Kann nicht bekommen POST Body von der Anfrage mit Express.js

Ich arbeite an einer API mit NodeJS und Express (und mehr Material wie Mongo, Steckdosen usw.), aber ich bleibe bei einem sehr einfachen Schritt, glaube ich, ich versuche nur, die Informationen aus dem POST req-Objekt, aber beim Versuch, auf req.body zuzugreifen, wird eine Fehlermeldung angezeigt 

Folgendes habe ich: 

var express     = require('express'),
    http        = require('http'),
    path        = require('path'),
    fs          = require('fs'),
    io          = require('socket.io');
    dynroute    = require('dynroute');

var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(app.router);
app.use(express.bodyParser());

app.post('/user', function(req, res) {

    console.log(JSON.stringify(req.body));
    res.send(req.body.self);
});

http.createServer(app).listen(app.get('port'), function ()
{
    console.log('App Server is now running at:' + app.get('port'));     
});

Auf der console.log(JSON.stringify(req.body)); bekomme ich undefined und auf der res.send(req.body.self); bekomme ich TypeError: Cannot read property 'self' of undefined

Ich habe nach dieser Art von Fehlern gesucht und das Problem ist normalerweise, dass die Leute keine app.use(express.bodyParser());-Middleware enthalten. Ich habe auch versucht, app.use(express.urlencoded()); und app.use(express.json()); zu verwenden.

Wenn ich eine console.log(req) mache, kann ich das gesamte Objekt sehen, aber ich kann nicht body oder irgendeinen Inhalt sehen, den ich übergeben werde, wenn ich die POST Anforderung von einem Client mache (ich gebe es als JSON weiter.) ).

* Ich weiß, ich könnte restify oder sails.js verwenden, um APIs in Node zu erstellen, aber ich möchte alles selbst machen, damit ich aus der Erfahrung lernen kann.

Vielen Dank

BEARBEITEN:

Ich musste die bodyparser-Middleware vor die app.router-Middleware legen.

26
kevinblanco

Bewegen Sie die bodyParser-Middleware über die router-Middleware!

var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(app.router);
31
Renato Gama

Content-Type = "application/json" sollte einer der Request Headers sein

8
Akash

BodyParser ist nicht mehr im Lieferumfang von Express enthalten

npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
2
Tobias Artz

Für mich @ kevinblancos Notiz: "Ich musste die Bodyparser-Middleware vor die app.router-Middleware legen, das ist das Problem!" hat es für mich getan Setzen Sie es in eine separate Antwort, da es am Boden begraben ist.

Ihr Code muss ungefähr so ​​aussehen:

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// My routing here
1
Ash Blue