mikemaccana
mikemaccana

Reputation: 123610

What's the best way to access the express 'app' object from inside a separate route file?

In Express 4, by default, routes are loaded from a separate file:

app.use('/', routes);

Would load routes/index.js.

I have a third-party library that attaches to app itself. Is there a preferred way to access app from inside routes/index.js?

I've thought about dependency injection ie, routes/index.js does

module.exports = function(app){ 
   (routes go here)
}

and then:

app.use('/', routes(app))

But I wonder if there's a better way. What's the best way to access the express 'app' object from inside a separate route file?

Upvotes: 6

Views: 3309

Answers (2)

Rob Meeuwisse
Rob Meeuwisse

Reputation: 2937

I looked at a number of app generators and everyone does it differently.

Mostly though I've seen it work the opposite from what you are asking. The route modules do not get the app passed in, they just return themselves and are attached to the app.

I like to use the following pattern:

routers/hello.js:

var express = require('express');
var router = express.Router();
router.get('/hello', function (req, res) {
   res.send('Hello, World!');
});
module.exports = router;

app.js:

var express = require('express');
var app = express();
app.use('/sample', require('./routers/hello'));
// other routers are attached
module.exports = app;

server.js:

var http = require('http');
var app = require('app');
var server = http.createServer(app);
server.listen(3000):

So the modules in routers/ return an Express Router object that are then attached to the app on their respective paths (routes).

This is inspired on the Express Application generator, but uses Routes instead of Routers. My advice, use the linked generator and start from there.

Upvotes: 0

Safi
Safi

Reputation: 1132

You can simply access app by req.app in your route handlers

Upvotes: 13

Related Questions