Search code examples
node.jshttprequesthttpserver

Get request body from node.js's http.IncomingMessage


I'm trying to implement a simple HTTP endpoint for an application written in node.js. I've created the HTTP server, but now I'm stuck on reading the request content body:

http.createServer(function(r, s) {
    console.log(r.method, r.url, r.headers);
    console.log(r.read());
    s.write("OK"); 
    s.end(); 
}).listen(42646);

Request's method, URL and headers are printed correctly, but r.read() is always NULL. I can say it's not a problem in how the request is made, because content-length header is greater than zero on server side.

Documentation says r is a http.IncomingMessage object that implements the Readable Stream interface, so why it's not working?


Solution

  • Ok, I think I've found the solution. The r stream (like everything else in node.js, stupid me...) should be read in an async event-driven way:

    http.createServer(function(r, s) {
        console.log(r.method, r.url, r.headers);
        var body = "";
        r.on('readable', function() {
            body += r.read();
        });
        r.on('end', function() {
            console.log(body);
            s.write("OK"); 
            s.end(); 
        });
    }).listen(42646);