Reputation: 779
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!
Upvotes: 34
Views: 55039
Reputation: 6641
You don't need bodyParser
. Simply add the following lines -
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
Upvotes: 0
Reputation: 69
You must install bodyParser
and then use it on your app like this:
// middlewares
app.use(bodyParser.json());
app.use(sucursalRoutes);
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
Hope this have helped you.
Upvotes: 0
Reputation: 2318
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());
Upvotes: 1
Reputation: 11
Most of the above-listed answers are right but at present [28-July-2020] the most suitable one is to use inbuilt's of express i.e:
app.use(express.json());
This will act as a middleware to accept the incoming JSON object in your request's
Upvotes: 1
Reputation: 930
Express has an inbuilt method for recognizing JSON objects from POST requests coming from the client end. Instead of using body-parser you can use this in your index.js file:
app.use(express.json());
Upvotes: 0
Reputation: 1
In Golang, you can set Content-Type as application/json before doing POST http client request to nodejs express router:
//Golang
import (
"bytes"
"encoding/json"
"errors"
"net/http"
)
//method := "POST"
//url := "http://ip:port/api/router"
func request(method string, url string, data interface{}, pHeader map[string]string) {
pBody, err := json.Marshal(data)
if err != nil {
return []byte{}, err
}
request, err = http.NewRequest(method, url, bytes.NewBuffer(pBody))
if(err!=nil ){
return []byte{}, err
}
request.Header.Set("Content-Type", "application/json")
//add header params if any
for key, head := range pHeader {
request.Header.Add(key, head)
}
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
return []byte{}, err
}
defer resp.Body.Close()
}
//NODEJS
//app.js
var express = require('express');
...
var app = express();
app.use(express.json());
var router= require('path/to/router.js');
//use the router
app.use('/api', router);
...
//router.js
router.post('/router', function (req, res, next) {
//log request body to view its values of incoming request
console.log('req.body', req.body)
})
Upvotes: 0
Reputation: 23845
Content-Type = "application/json"
should be one of the Request Headers
Upvotes: 18
Reputation: 51
BodyParser is no longer bundled with Express
npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
Upvotes: 5
Reputation: 5602
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
Upvotes: 1
Reputation: 16599
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);
Upvotes: 41