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
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With