Below is the app.js, users.js and user.js routes of a node application I am building. As you can see I am connecting to the SQL DB in each route, and this is not ideal. I have tried passing the connection to different routes at least 3 different ways based on examples online. I have failed multiple times. Please advise as to the best way to pass this connection. I am sure there are other errors in my code, so anywhere I can improve I would appreciate feedback. Thank you. It is currently working, kinda. You can sign up login with auth and submit a bid working version here: https://pure-sierra-43583.herokuapp.com But the server times out and the app crashes a lot. /* APP.JS */ var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var exphbs = require('express-handlebars'); var expressValidator = require('express-validator'); var flash = require('connect-flash'); var session = require('express-session'); var passport = require('passport'); var LocalStrategy = require('passport-local'),Strategy; var mongo = require('mongodb'); async = require('async'); SchemaObject = require('node-schema-object'); var app = express(); // This should make our db available in all views.. /* wrapped our database object into every request .*/ app.use(function(req,res,next){ //req.conn = conn; req.app = app; //req.db = db; // handle_database(req,res); next(); }); var routes = require('./routes/index'); var users = require('./routes/users'); var classes = require('./routes/classes'); var bids = require('./routes/bids'); //var students = require('./routes/students'); var clients = require('./routes/clients'); //var reviews = require('./routes/reviews'); var instructors = require('./routes/instructors'); var companys = require('./routes/companys'); //var instructors = require('./routes/instructors'); // view engine setup app.set('views', path.join(__dirname, 'views')); app.engine('handlebars', exphbs({defaultLayout: 'layout'})); app.set('view engine', 'handlebars'); // uncomment after placing your favicon in /public //app.use(favicon(__dirname + '/public/favicon.ico')); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // Express Session app.use(session({ secret: 'secret', saveUninitialized: true, resave: true })); // Passport app.use(passport.initialize()); app.use(passport.session()); // Express Validator app.use(expressValidator({ errorFormatter: function(param, msg, value) { var namespace = param.split('.') , root = namespace.shift() , formParam = root; while(namespace.length) { formParam += '[' + namespace.shift() + ']'; } return { param : formParam, msg : msg, value : value }; } })); // Connect-Flash app.use(flash()); // Global Vars app.use(function (req, res, next) { res.locals.messages = require('express-messages')(req, res); if(req.url == '/'){ res.locals.isHome = true; } next(); }); // Makes the user object global in all views app.get('*', function(req, res, next) { app.use(flash()); // put user into res.locals for easy access from templates res.locals.user = req.user || null; if(req.user){ res.locals.type = req.user.type; if(req.user.type == 'company'){ res.locals.isCompany = true; } if(req.user.type == 'client'){ res.locals.isClient = true; } } next(); }); app.use('/', routes); app.use('/users', users); app.use('/classes', classes); app.use('/bids', bids); //app.use('/students', students); app.use('/clients', clients); //app.use('/reviews', reviews); app.use('/instructors', instructors); app.use('/companys', companys); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); module.exports = app; /* users.js route */ var express = require('express'); var router = express.Router(); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var db = require('../database'); var returnedPw; var flash = require('connect-flash'); var session = require('express-session'); var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'nunyabusiness', user : '', password : '', database : '' }); // Include User Model var User = require('../models/user'); // Include Student Model var Client = require('../models/client'); // Include Instructor Model var Company = require('../models/company'); router.get('/signup', function(req, res, next) { res.render('users/signup'); }); router.post('/signup', function(req, res, next){ // Get Form Values console.log('starting post and making new user'); var first_name = req.body.first_name; var last_name = req.body.last_name; var street_address = req.body.street_address; var city = req.body.city; var state = req.body.state; var zip = req.body.zip; var email = req.body.email; var username = req.body.username; var password = req.body.password; var password2 = req.body.password2; var type = req.body.type; // Form Field Validation req.checkBody('first_name', 'First name field is required').notEmpty(); req.checkBody('last_name', 'Last name field is required').notEmpty(); req.checkBody('email', 'Email field is required').notEmpty(); req.checkBody('email', 'Email must be a valid email address').isEmail(); req.checkBody('username', 'Username field is required').notEmpty(); req.checkBody('password', 'Password field is required').notEmpty(); req.checkBody('password2', 'Passwords do not match').equals(req.body.password); var errors = req.validationErrors(); if(errors){ res.render('users/signup', { errors: errors, first_name: first_name, last_name: last_name, street_address: street_address, city: city, state: state, zip: zip, email: email, username: username, password: password, password2: password2 }); } else { var newUser = new User({ email: email, username:username, password: password, type: type }); console.log('calling post to database file to receive new user:' + newUser) // THIS IS WHERE WE ARE POSTING THE NEW USER TO THE DATABASE!!! //db.registerUsers(newUser); User.saveUser(newUser); var newClient = new Client({ first_name: first_name, last_name: last_name, address: [{ street_address: street_address, city: city, state: state, zip: zip }], email: email, username:username }); if(type == 'client'){ //User.saveClient(newUser, newClient, function(err, user){ // console.log('Client created'); ///}); works but replacing w sql } else { var newCompany = new Company({ first_name: first_name, last_name: last_name, address: [{ street_address: street_address, city: city, state: state, zip: zip }], email: email, username:username }); console.log('calling sql save..'); //db.postUsers(newUser, newClient); } req.flash('success','User added'); res.redirect('/'); } }); <!--//// -USER AUTH SECTION- \\\\--!><!--//// -USER AUTH SECTION- \\\\--!><!--//// -USER AUTH SECTION- \\\\--!> passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { done(null, user); }); router.post('/login',passport.authenticate('local',{failureRedirect:'/', failureFlash:'Wrong Username or Password'}), function(req, res){ req.flash('success','You are now logged in'); // it appears that the pipes re crossed and the type is being set as the username. need to check our model and post var usertype = req.user.type; // res.redirect('/'/*+usertype+'s/classes' */); console.log(user + 'hail Mary'); res.redirect('/' /*, { "results": user } */ ); }); passport.use(new LocalStrategy( function(username, password, done ) { console.log('in users the username is ' + username) connection.query('SELECT password FROM t_user WHERE username = ?', username, function(err, user) { console.log(user +'got user') parseResults(user, done); });// end query function parseResults(user, done) { Object.keys(user)[0]; var key = Object.keys(user)[0]; user[key]; var storedPw = user[key]; for(var i in storedPw){ returnedPw = storedPw[i]; } console.log('returnedPw is defined here ' +returnedPw); movePw(returnedPw, done); }// end function var candidatePassword = password; function movePw (returnedPw, done) { if (returnedPw ) { User.comparePassword(candidatePassword, returnedPw, function(err, isMatch) { if (err) return done(err); if(isMatch) { user = username; return done(null, user); } else { console.log('Invalid Password'); // Success Message req.flash('failureFlash','User Access Denied. False Password'); return done(null, false, { message: 'Invalid password' }); } }); } else {console.log('return PW not defined')} } }// end outer function ? ));//end passport // Log User Out router.get('/logout', function(req, res){ req.logout(); // Success Message req.flash('success', "You have logged out"); res.redirect('/'); }); function ensureAuthenticated(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect('/') } module.exports = router; /* User.js */ var SchemaObject = require('node-schema-object'); var db = require('../database'); var connection = require('express-myconnection'); var mysql = require('mysql'); var bcrypt = require('bcryptjs'); var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'sm', user : 'an', password : '', database : 't' }); // User Schema var user = new SchemaObject({ email: { type: String }, username: { type: String }, password:{ type:String, bcrypt: true }, type:{ type:String } }); var User = module.exports = user; // Fetch All Classes module.exports.getUserById = function(id, callback){ User.findById(id, callback); } // #1 IN THE LOGIN PROCESS THIS IS FIRST FUNCTIO CALLED module.exports.getUserByUsername = function(username){ console.log('in our user model, attempting to fetch user...') console.log('connected as id ' + connection.threadId); console.log('returning username function...') console.log('making sure we got the username ' + username) var query = {username: username}; connection.query('SELECT ? FROM t_user',query, function(err, results, query) { if (err) throw err; if(!err) { console.log('um ok, heres your query results i guess.. ' + results) indexPage.receiveResults(results); } }); }; // Recieve Results exports.useReceiveResults = function (results) { res.render('index', { "results": results }); }; // Save Client module.exports.saveClient = function(newUser, newClient, callback){ bcrypt.hash(newUser.password, 10, function(err, hash){ if(err) throw errl // Set hash newUser.password = hash; console.log('Client is being saved looking for db'); async.parallel([newUser.save, newClient.save], callback); return; }); } // Save User module.exports.saveUser = function(newUser, callback){ bcrypt.hash(newUser.password, 10, function(err, hash){ if(err) throw errl // Set hash newUser.password = hash; console.log('Client is being saved looking for db'); //async.parallel([newUser.save, newClient.save], callback); connection.query('INSERT INTO t_user SET ?',newUser, function(err, results, newUser) { //connection.release(); if(err) console.log(err + 'darnit'); if(!err) console.log('data recieved by database...'); }); return; }); } // Save Company module.exports.saveCompany= function(newUser, newCompany, callback){ bcrypt.hash(newUser.password, 10, function(err, hash){ if(err) throw errl // Set hash newUser.password = hash; console.log('Company is being saved'); async.parallel([newUser.save, newCompany.save], callback); }); } // Compare password module.exports.comparePassword = function(candidatePassword, returnedPw, callback){ bcrypt.compare(candidatePassword, returnedPw, function(err, isMatch){ if(err) throw err; callback(null, isMatch); }); }