Can't get POST body from request using Express.js

42,808

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
Share:
42,808
kevinblanco
Author by

kevinblanco

Front-End Engineer, Drupal experienced developer, NodeJS Enthusiast.

Updated on February 18, 2022

Comments

  • kevinblanco
    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 access req.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 get undefined and on the res.send(req.body.self); I get TypeError: 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 using app.use(express.urlencoded()); and app.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 see body 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 or sails.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 the app.router middleware, that fixed it!