Node JS: Where is my POST data?

I have no lack with sending POST request to node js server. I have a simple request and a simple server.

My server code is:

var http = require('http');
var bodyParser   = require('body-parser');
http.createServer(function (req, res) {

console.log(req.body);

res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/')

my client request code is:

var val = JSON.stringify({ city:"SomeCity", name:"MyNameIsHere" });
alert(val);
$.ajax({
     url: 'http://127.0.0.1:1337',
     type: 'POST',
     data: { value:  val},
     success: function(result) {
         alert('the request was successfully sent to the server');}
});

So I suppose to get SomeCity and MyNameIsHere strings in the request body at the node js server, but the req.body field is undefined. Have to say that I open my test.html with request code locally with URL like this:

file:///D:/Projects/test.html

May be Im blind and overseen something trivial, but I have no idea what:)

Have to say that I open my test.html with request code locally with URL like this: file:///D:/Projects/test.html

You're trying to post cross-domain, which you cannot do in this case. Serve your HTML over HTTP so that you can make a POST. If you use your browser's development tools, you will see that the request will never hit your Node.js server (except for a possible pre-flight request for CORS).

Another problem is that you're not actually using body-parser. If you want the post data, you will have to read from req like a stream.

You are including "body-parser" in var bodyParser = require('body-parser');, but you never actually use it. It won't magically parse the request for you. The default request object does not have a body property... see the documentation.

If you want to use the body-parser module, you should probably use express.js and read the documentation on how to connect it as middleware.

If you want to get the body using the built-in http server, you need to consume the request object first using something like this:

if (req.method == 'POST') {
    var body = '';
    req.on('data', function(data) {
        body += data;
        if (body.length > 1000000) {
            req.connection.destroy();
        }
    });
    req.on('end', function () {
        console.log(req.body);

        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end('Hello World\n');
    });
}

Adding express library and bodyparser as middleware did the trick. However I could use the code from neelsg answer but working with built-in http server and handling Post data by my own is too burdensome. So piece of my working code is here:

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

var app = express();
app.use(express.bodyParser(
{
    keepExtensions: true,
    limit: 30*1024*1024 // lets handle big data  
}
));
app.use(bodyParser.urlencoded());

Bodyparser by default can handle only 100Kb data in the post request, so I had to increase limit using its config options.