Search code examples
javascriptexpressknex.js

How to pass DB object in multi router setting in ExpressJS?


I would like to make multiple router settings like the example in ExpressJS Doc. I have index.js , api1 , api2 like below. How can I pass the db object from index.js to api1 and api2?

I try with app.use('/api/v1', require('./controllers/api_v1')(db));

but it shows errors:Router.use() requires a middleware function but got a Object

index.js:

var express = require('../..');
const knex = require('knex');
const config = require('./config');

var app = module.exports = express();
const db = knex(config.db);

app.use('/api/v1', require('./controllers/api_v1'));
app.use('/api/v2', require('./controllers/api_v2'));

app.get('/', function(req, res) {
  res.send('Hello from root route.')
});

/* istanbul ignore next */
if (!module.parent) {
  app.listen(3000);
  console.log('Express started on port 3000');
}

api_v1.js

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

var apiv1 = express.Router();

apiv1.get('/', function(req, res) {
  res.send('Hello from APIv1 root route.');
});

apiv1.get('/users', function(req, res) {
  res.send('List of APIv1 users.');
});

module.exports = apiv1;

api_v2.js

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

var apiv2 = express.Router();

apiv2.get('/', function(req, res) {
  res.send('Hello from APIv2 root route.');
});

apiv2.get('/users', function(req, res) {
  res.send('List of APIv2 users.');
});

module.exports = apiv2;

Solution

  • You could export the db object from a database.js file and require it in the index.js file as well as every other file where you need database access. Or, an easier but uglier method, would be to make the variable global via global.db = db. You could then use db everywhere in your Node.JS application.