HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptModerate

Passing Node.js SQL connection to multiple routes

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
routessqlpassingnodemultipleconnection

Problem

Here are 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. It is currently working, kinda. You can sign up login with auth and submit a bid working version here. 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(__dirnam

Solution

You can create a file

db.js

var mysql = require('mysql');
var settings = require('./settings.json');
var db;

function connectDatabase() {
    if (!db) {
        db = mysql.createConnection(settings);

        db.connect(function(err){
            if(!err) {
                console.log('Database is connected!');
            } else {
                console.log('Error connecting database!');
            }
        });
    }
    return db;
}

module.exports = connectDatabase();`


This will create a singleton db connection;
Also as you can see, you could have your mysql settings in another file

settings.json

{
    host : 'sm',
    user : 'an',
    password : '',
    database : 't'
}


That way you have everything more organized.

Then on each of your files where you want to make a query you just have to require the db.js file

var db = require('./db');


and with that var call the query function. For instance in your User.js file, the query to get the user by name would be something like:

var db = require('./db');

db.query('SELECT ? FROM t_user',query, function(err, results, query) {
    if (err) throw err;
    if(!err) {
        indexPage.receiveResults(results);
    }
});

Code Snippets

var mysql = require('mysql');
var settings = require('./settings.json');
var db;

function connectDatabase() {
    if (!db) {
        db = mysql.createConnection(settings);

        db.connect(function(err){
            if(!err) {
                console.log('Database is connected!');
            } else {
                console.log('Error connecting database!');
            }
        });
    }
    return db;
}

module.exports = connectDatabase();`
{
    host : 'sm',
    user : 'an',
    password : '',
    database : 't'
}
var db = require('./db');
var db = require('./db');

db.query('SELECT ? FROM t_user',query, function(err, results, query) {
    if (err) throw err;
    if(!err) {
        indexPage.receiveResults(results);
    }
});

Context

StackExchange Code Review Q#120331, answer score: 12

Revisions (0)

No revisions yet.