I have the following in my app.js file:
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'user',
password: 'password',
database: 'mydatabase'
});
connection.connect();
In routes/index.js, I currently have only the boilerplate code:
var express = require('express');
var router = express.Router();
module.exports = router;
How do I make available the connection object from the app.js file in routes/index.js?
My preference is to do some simple dependency injection and pass the required resource into the router by wrapping the module in a function:
var express = require('express');
module.exports = function (connection) {
var router = express.Router();
//do stuff with the connection
return router;
}
Then you just instantiate the router module in app.js as a function with the database connection as an argument:
app.use('/where/ever', require('./module-b')(connection));
Usually I wrap up the dependencies in an object {db:connection}, this way I don't have to keep changing the function signature as I add more dependencies.
I ended up splitting the database connection logic from the app.js file. In a separate file called connection.js, I have the following:
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'user',
password: 'password',
database: 'mydatabase'
});
module.exports = connection;
Then in my route file, I add
var connection = require('../connection');
to the top of the file where all my other modules are brought in. In my instance, the connection.js file is one level higher than my route file, hence the ../ in the require() function parameter.
Check out express-myconnection, it lets you access the MySQL connection from within your routes.
After using express-myconnection in production, I would not recommend it - it leaks connections, causing requests to hang (callback will never be called), and it is no longer actively maintained.