patternjavascriptModerate
Passing Node.js SQL connection to multiple routes
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
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
This will create a singleton db connection;
Also as you can see, you could have your mysql settings in another file
settings.json
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
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:
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.