Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 696
Jabaa Avatar asked Apr 05 '17 09:04

Jabaa


2 Answers

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

like image 62
Parwat Kunwar Avatar answered Nov 19 '22 11:11

Parwat Kunwar


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.

like image 43
greuze Avatar answered Nov 19 '22 12:11

greuze