Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js Express: require/use one app within another

I'm facing the following situation. In order to further modulize my software development, I've written a few standard modules stand alone. Think for instance of an login module based upon Express and Passport, allowing users to login with all kinds of social services. The module also contains UI for user management, login, registration, profile, etc.

Now, the thing I'm trying to do is to just drop the Auth app folder (containing the express app, all it's routes, views, models, settings and dependecies) into another Express app (for instance, a CMS) and then load it with something like require('./lib/auth/app.js'). I know this is possible, take a look at Kue.

How would I go about doing this? And how do I manage namespacing problems? I could of cours append /auth/ to each route, but I can imagine the settings (app.use()'s) and public folder would conflict with the 'parent' app.js' settings and public folder.

Thanks in advance,

Fabian

like image 328
Fabdrol Avatar asked Sep 05 '12 16:09

Fabdrol


1 Answers

Think I found my answer. So, I found this question, and this one. Guess my terminology was off.

I solved my problem by doing a few things. First of all, I changed all routes and url's to be "namespaced" (not really, but this does the job). All routes now have /auth/ in front of them. I did the same to all links, so that's all working.

Next, I removed the server part from my app.js. So, in stead of doing:

require('http').createServer(app).listen(app.get('port'));

I just do:

module.exports = app;

And I add some custom methods to the app object:

app.isLoggedIn = auth.isLoggedIn;
app.notLoggedIn = auth.notLoggedIn;

Then, in my root app, I just do the following to load the auth app in. Routing, public files, and all other stuff happens magically. pretty cool.

var auth = require('./vendor/auth/app');
var app  = express();

app.configure(function() {
    app.use(auth); // use our auth app

    // do a lot of root-app related stuff...
});

Things still to do:

My auth app uses some session stuff. According to the second link, if I understand correctly, the app.use(session...) stuff in my auth app gets overridden by app.use. Also, I want to define an EJS helper to generate my urls (something like site_url('/facebook/callback') which then points to /auth/facebook/callback). Finally, I need to include settings from my root app. I'm thinking of wrapping my entire app.js (in auth) in a function, to which I pass a config object. Like this:

module.exports = function(config) {
    var app = express();

    app.set('config', config);
    // various app settings, routes, etc

    // return app so it's available in my root.
    return app;

}

I hope this helps, if you need a bit more information I'll see if I can post some code to a gist. just let me know!

like image 171
Fabdrol Avatar answered Sep 16 '22 18:09

Fabdrol