jsonnode.jsexpress

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?


Solution

  • 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"}