[Solved] Express js req.body returns empty

I’ve tried the all solutions from some another stackoverflow posts but it didn’t solved my issue.

Here is my app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');



var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

var index = require('./routes/index');
var v1    = require('./routes/route');

app.use('/', index);
//routes for api
app.use('/v1',v1);

Here is my post controller

module.exports = {

    createUser:function (req,res) {
        console.log(req.body);
        res.send('ok'+req.body.test);
    }
}

req.body returns {} even if the request body contains the parameters.

I am checking the api’s with postman plugin.

Update

Postman request

enter image description here

Enquirer: Jabaa

||

Solution #1:

body-parser

The bodyParser object exposes various factories to create middlewares. All middlewares will populate the req.body property with the parsed body, or an empty object {} if there was no body to parse (or an error was returned).


app.use(bodyParser.urlencoded({ extended: true })); // for encoded bodies

A new body object containing the parsed data is populated on the request object after the middleware, req.body will contain the parsed data, this object will contain key-value pairs, where the value can be a string or array

The Content-Type is application/x-www-form-urlencoded


app.use(bodyParser.json()); // for json encoded bodies

A new body object containing the parsed data is populated on the request object after the middleware (i.e. req.body).

The Content-Type is application/json


application/json is used when you are posting the data {"test":"hello"} like this. www-form-url-encoded is used to get the data as key-value in object from the url when used the app.use(bodyParser.urlencoded({ extended: true }));. They both are different and have their own use cases

Respondent: Jabaa

Solution #2:

After removing the last 4 lines of code (to be sure you are configuring correctly the routes) and adding this test lines:

app.post('/ping', function (req,res) {
    console.log(req.body);
    res.send('ok ' + req.body.test);
});
let server = http.createServer(app);
server.listen(8899, function onstart() {
    console.log('server listening');
});

When I run:

curl -X POST http://localhost:8899/ping -d '{"test": 1234}'

I get ok undefined, like you did. After adding the proper content-type header:

curl -X POST http://localhost:8899/ping -d '{"test": 1234}' -H "content-type: application/json"

it works like a charm and I get ok 1234. So I think you are missing the "content-type: application/json" header in your postman.

Respondent: p0k8h

The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Leave a Reply

Your email address will not be published.