简体   繁体   中英

Can't get POST body from request using Express.js

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!

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);

Content-Type = "application/json"应该是Request Headers

BodyParser is no longer bundled with Express

npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));

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

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 ie:

app.use(express.json());

This will act as a middleware to accept the incoming JSON object in your request's

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)
})

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());

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());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM