web-dev-qa-db-fra.com

Ne peut pas obtenir POST corps de requête utilisant Express.js

Je travaille sur une API avec NodeJS et Express (et plus de choses comme le mongo, les sockets, etc.) mais je suis bloqué sur une étape très simple, je crois, j'essaye juste d'obtenir les informations du POST req object, mais j'obtiens une erreur en essayant d'accéder à req.body 

Voici ce que j'ai: 

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

Sur console.log(JSON.stringify(req.body)); je reçois undefined et sur res.send(req.body.self); je reçois TypeError: Cannot read property 'self' of undefined

Je cherchais ce type d’erreurs et le problème, c’est que les gens n’incluent pas le middleware app.use(express.bodyParser());; j’ai également essayé d’utiliser app.use(express.urlencoded()); et app.use(express.json());, mais cela n’a pas fonctionné.

Si je fais un console.log(req), je peux voir l'objet en entier mais je ne peux pas voir body ni le contenu que je transmets lorsque je fais la demande POST d'un client (je le transmets en tant que JSON ).

* Je sais que je pourrais utiliser restify ou sails.js pour créer des API dans Node, mais je veux tout faire moi-même afin de pouvoir apprendre de cette expérience.

Merci

MODIFIER:

Je devais mettre le middleware bodyparser avant le middleware app.router, ça corrige ça!

26
kevinblanco

Déplacez le middleware bodyParser au-dessus du middleware router!

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" devrait être l'un des Request Headers

8
Akash

BodyParser n'est plus fourni avec Express

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

Pour moi, la note de @ kevinblanco: "Je devais mettre le middleware bodyparser avant le middleware app.router, ça y est! l'a fait pour moi. En le mettant dans une réponse séparée puisque son enterré au bas.

Votre code devra ressembler à ceci:

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