2

Im trying to post to a route in express 4, but when i try to log body i get undefined message, here are my configs:

/server.js

/* main module entry point */
'use strict';

var express    = require( './server/node_modules/express' );
var bodyParser = require( './server/node_modules/body-parser' );
var env        = require( './server/env' );
var app        = module.exports = express();

app.use( require( './server/modules/auth' ) );

app.use( express.static( __dirname + '/client/' ) );

app.use( bodyParser.urlencoded( {
    extended: true
} ) );

app.use( bodyParser.json() );

app.get( '/*', function ( require, response ) {

    response.sendFile( __dirname + '/client/index.html' );

} );

app.listen( env.port, function () {

    console.log( 'Listening to port ' + env.port );

} );

/server/modules/auth/index.js

module.exports = (function () {

    var express = require('express'),
        router = express.Router(),
        signin = require('./signin.controller');

    router.route( '/signin' )
        .get( signin.get )
        .post( signin.post );

    return router;

})();

/server/modules/auth/sigin.controller.js

module.exports = (function () {

models = require( '../../database/models' );

function get( request, response ) {

    models.users.findAll().then( function ( users ) {

        response.json( users );

    } );
    console.log( 'Sign In' );

}

function post( request, response ) {

    console.log( 'Sign In ' + request.body );//Returns "Sign In Undefined"
    response.send('Signed In'+ request.body);

}

return {
    get: get,
    post: post
}

})();

Is there anything wrong in the code?, I'm using postman to test it: postman

The header i'm using is:

Content-Type: application/json

Jonathan Solorzano
  • 6,812
  • 20
  • 70
  • 131

2 Answers2

2

Order matters. Try this:

/* main module entry point */
'use strict';

var express    = require( './server/node_modules/express' );
var bodyParser = require( './server/node_modules/body-parser' );
var env        = require( './server/env' );
var app        = module.exports = express();

app.use( express.static( __dirname + '/client/' ) );

app.use( bodyParser.urlencoded( {
    extended: true
} ) );

app.use( bodyParser.json() );

app.use( require( './server/modules/auth' ) );

app.get( '/*', function ( require, response ) {

    response.sendFile( __dirname + '/client/index.html' );

} );

app.listen( env.port, function () {

    console.log( 'Listening to port ' + env.port );

} );

Basically you're telling express not to parse the body content until after the middleware in auth.js is run.

Timothy Strimple
  • 22,920
  • 6
  • 69
  • 76
  • Really thank you!, i didn't noticed it jaja, also i would like to know other thing, is it necessary to declare route params like `/any/route/:id` in order to send data, or could i just send them just as params? – Jonathan Solorzano Nov 05 '15 at 02:19
  • You can also just send them as query string parameters if that's what you mean. So the user could call: `/any/route?id=123` – Timothy Strimple Nov 05 '15 at 02:26
  • No no, what i mean is that Express support route params like: `/product/:id/detail`, but how is that different from sending them as above? check out [this link](https://www.safaribooksonline.com/blog/2014/03/13/parameterized-routes-express-js/) to get an idea of what i say – Jonathan Solorzano Nov 05 '15 at 02:42
1

Starting from 4.16, feel free to use express.json() instead of body-parse, more detail: express.json vs bodyParser.json.

Tan Bui
  • 81
  • 1
  • 5