Can't get POST body from request using Express.js
Solution 1
Move the bodyParser
middleware above the 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);
Solution 2
Content-Type = "application/json"
should be one of the Request Headers
Solution 3
BodyParser is no longer bundled with Express
npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
Solution 4
in my case I have to add these two line to read post request body
app.use(express.json());
// add this middleware to read post request body
app.use(express.text());
Solution 5
For me @kevinblanco's note of "I had to put the bodyparser middleware before the app.router middleware, that fix it!" did it for me. Putting it in a separate answer since its buried at the bottom.
Your code will need to look something like this:
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
kevinblanco
Front-End Engineer, Drupal experienced developer, NodeJS Enthusiast.
Updated on February 18, 2022Comments
-
kevinblanco about 2 years
I'm working on an API with NodeJS and Express (and more stuff like mongo, sockets, etc) but i'm stuck on a very simple step I believe. I'm just trying to get the information from the POST
req
object, but I get an error when trying to accessreq.body
Here's what I have:
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')); });
On the
console.log(JSON.stringify(req.body));
I getundefined
and on theres.send(req.body.self);
I getTypeError: Cannot read property 'self' of undefined
I've been seaching for this type of error and usually the issue is that people do not include
app.use(express.bodyParser());
middleware , so I also tried usingapp.use(express.urlencoded());
andapp.use(express.json());
, which didn't work either.If I do a
console.log(req)
I can see the entire object but I do not get to seebody
or any of the content I'm passing when doing the POST request from a client (I'm passing it as JSON).**I know I could use
restify
orsails.js
to build APIs within Node but i want to do everything myself so I can learn from the experience.*Thanks
EDIT: I had to put the
bodyparser
middleware before theapp.router
middleware, that fixed it!