Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Express js body parser not working?

Express js body parser not working?

Problem

I have the following in my node server using express (truncated to the important parts):

var app = express.createServer();

app.all(/test/,function(req,res){
    console.log(req.headers);
    console.log(req.body);
    res.send("");
});

function appStart(cobrands){
    app.configure(function(){
        app.use(express.bodyParser());
        app.use(express.cookieParser());

        app.use('/min',express.static('../min'));
        app.use('/js',express.static('../js'));
        app.use('/css',express.static('../css'));
        app.use('/img',express.static('../img'));
    });
    app.listen(8080);
}

I then have a simple form that calls out to localhost:8080 like so:

But express.bodyParser doesn't seem to be doing anything, and req.body is undefined. Here's the output of the console.logs:

// req.headers
{ host: 'localhost:8080',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_1) AppleWebKit/534.48.3 (KHTML, like Gecko) Version/5.1 Safari/534.48.3',
  'content-length': '27',
  accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  origin: 'file://',
  'content-type': 'application/x-www-form-urlencoded',
  'accept-language': 'en-us',
  'accept-encoding': 'gzip, deflate',
  cookie: '',
  connection: 'keep-alive' }
// req.body
undefined

Note: content-type is correctly defined as application/x-www-form-urlencoded as it should be for bodyParser to work, and I've verified that it's coming over by popping open the debug tools in Safari and verifying that the form data is present.

Problem courtesy of: Jesse

Solution

http://expressjs.com/guide.html#configuration

Note the use of app.router, which can (optionally) be used to mount the Application Routes, otherwise the first call to app.get(), app.post(), etc will mount the routes.

What's happening is you're calling app.all() before adding any of the other middleware. Doing this effectively puts app.router in front of all of your other middleware, resulting in them never being used on requests that end inside your routes.

Mounting the application routes is pretty much the same as doing app.use(app.router);.

In the end your stack is looks this:

app.use(app.router); // Contains your /test/ route
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use('/min',express.static('../min'));
app.use('/js',express.static('../js'));
app.use('/css',express.static('../css'));
app.use('/img',express.static('../img'));

tl;dr Move your route between your call to app.configure() and app.listen().

Solution courtesy of: Ryan Olds

Discussion

View additional discussion.



This post first appeared on Node.js Recipes, please read the originial post: here

Share the post

Express js body parser not working?

×

Subscribe to Node.js Recipes

Get updates delivered right to your inbox!

Thank you for your subscription

×