neuromancer
neuromancer

Reputation: 55469

How do I consume the JSON POST data in an Express application

I'm sending the following JSON string to my server.

(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)

On the server I have this.

app.post('/', function(request, response) {

    console.log("Got response: " + response.statusCode);

    response.on('data', function(chunk) {
        queryResponse+=chunk;
        console.log('data');
    });

    response.on('end', function(){
        console.log('end');
    });
});

When I send the string, it shows that I got a 200 response, but those other two methods never run. Why is that?

Upvotes: 436

Views: 703381

Answers (8)

SATYAM RAJ
SATYAM RAJ

Reputation: 31

Try adding this before your app.post(). I used fetch() instead of axios(), and I forgot to add the JSON parser.

app.use(express.urlencoded({ extended: false }));

app.use(express.json());

Upvotes: 3

Pero P.
Pero P.

Reputation: 26982

I think you're conflating the use of the response object with that of the request.

The response object is for sending the HTTP response back to the calling client, whereas you are wanting to access the body of the request. See this answer which provides some guidance.

If you are using valid JSON and are POSTing it with Content-Type: application/json, then you can use the bodyParser middleware to parse the request body and place the result in request.body of your route.

Update for Express 4.16+

Starting with release 4.16.0, a new express.json() middleware is available.

var express = require('express');

var app = express();

app.use(express.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

Updated for Express 4.0 - 4.15

Body parser was split out into its own npm package after v4, requires a separate install npm install body-parser

var express = require('express')
  , bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

For earlier versions of Express (< 4)

var express = require('express')
  , app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
  response.send(request.body);    // echo the result back
});

app.listen(3000);

Test along the lines of:

$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}

Upvotes: 746

Hatim
Hatim

Reputation: 447

A beginner's mistake...i was using app.use(express.json()); in a local module instead of the main file (entry point).

Upvotes: 0

anneb
anneb

Reputation: 5768

@Daniel Thompson mentions that he had forgotten to add {"Content-Type": "application/json"} in the request. He was able to change the request, however, changing requests is not always possible (we are working on the server here).

In my case I needed to force content-type: text/plain to be parsed as json.

If you cannot change the content-type of the request, try using the following code:

app.use(express.json({type: '*/*'}));

Instead of using express.json() globally, I prefer to apply it only where needed, for instance in a POST request:

app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});

Upvotes: 29

SuRa
SuRa

Reputation: 1093

const express = require('express');
let app = express();
app.use(express.json());

This app.use(express.json) will now let you read the incoming post JSON object

Upvotes: 24

Daniel Thompson
Daniel Thompson

Reputation: 2353

For those getting an empty object in req.body

I had forgotten to set headers: {"Content-Type": "application/json"} in the request. Changing it solved the problem.

Upvotes: 70

xims
xims

Reputation: 1608

Sometimes you don't need third party libraries to parse JSON from text. Sometimes all you need it the following JS command, try it first:

        const res_data = JSON.parse(body);

Upvotes: 19

chrisarton
chrisarton

Reputation: 4441

For Express v4+

install body-parser from the npm.

$ npm install body-parser

https://www.npmjs.org/package/body-parser#installation

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/json
app.use(bodyParser.json())

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next()
})

Upvotes: 227

Related Questions