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
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.bodywill 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
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.