2
votes

I am new to node.js. I am trying to do create a registration page and save the entered values in database using mysql.

I am able to do so by passing parameters on request header. But, it's always not a good idea to pass parameters in request header. So trying to pass parameters on Request body.

I am using Postman to test my node.js service.

Here's github link for my demo application

https://github.com/debasish283/node_gulp

What extra I need to do to pass parameters in request body?

When passing parameters in request body I am getting the below mentioned error.

TypeError: Cannot read property 'firstname' of undefined
   at Object.db.register (/var/projects/node_gulp/server/db.js:13:65)
   at wrapper.register (/var/projects/node_gulp/server/wrapper.js:8:12)
   at Layer.handle [as handle_request] (/var/projects/node_gulp/node_modules/express/lib/router/layer.js:95:5)
   at next (/var/projects/node_gulp/node_modules/express/lib/router/route.js:131:13)
   at Route.dispatch (/var/projects/node_gulp/node_modules/express/lib/router/route.js:112:3)
   at Layer.handle [as handle_request] (/var/projects/node_gulp/node_modules/express/lib/router/layer.js:95:5)
   at /var/projects/node_gulp/node_modules/express/lib/router/index.js:277:22
   at Function.process_params (/var/projects/node_gulp/node_modules/express/lib/router/index.js:330:12)
   at next (/var/projects/node_gulp/node_modules/express/lib/router/index.js:271:10)
   at Function.handle (/var/projects/node_gulp/node_modules/express/lib/router/index.js:176:3)

Code: server -> wrapper.js

var express = require('express');
var db = require('./db.js');
var config = require('config');

var wrapper = {
register: function(req, res) {
console.log('inside wrapper');
db.register(req.body);
}
};
module.exports = wrapper;

routes -> index.js

var router = require('express').Router();
var wrapper = require('../server/wrapper');

router.post('/register', wrapper.register);

module.exports = router;

app.js

var express = require('express');
var app = express();
var port = process.env.PORT || 3000;
var router = require('./routes');
var bodyParser = require('body-parser');

app.use('/', router);

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

app.listen(port, function() {
console.log('Server started at ' + port);
});

server-> db.js

var mysql = require('mysql');
var config = require('config');

var connection = mysql.createConnection({
host: config.get('database.host'),
user: config.get('database.user'),
password: config.get('database.password'),
database: config.get('database.database')
});
var db = {
register: function(parameter) {
var qry = 'insert into users values (' + "'" + parameter.firstname + "'" + ',' + "'" + parameter.lastname + "'" + ',' + "'" + parameter.username + "'" + ',' + "'" + parameter.bday + "'" + ',' + "'" + parameter.gender + "'" + ',' + "'" + parameter.password + "'" + ')';
console.log(qry);
connection.connect();
connection.query(qry, function(err, rows, fields) {
if (!err) {
        console.log('The solution is: ', rows);
        } else
            console.log('Error while performing Query.' + err);
    });

    connection.end();
}
};
module.exports = db;
2
Check what you have in req.body, req.query. Im thinking all your data goes to req.query.. - Mykola Borysyuk

2 Answers

4
votes

You need to move your body parsing middleware before your routes so that the request body is parsed first before executing your route handlers:

// app.js

// ...

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

app.use('/', router);

// ...
2
votes

Correct order of the body parser should be as following.

app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({ extended: true }));
app.use('/', router);

Check the following link for the example.
https://scotch.io/tutorials/use-expressjs-to-get-url-and-post-parameters