Jordonias
Jordonias

Reputation: 5848

Is there a better way to use middleware in middleware?

For example I want to create some middleware that uses Passport but I don't want to have to require Passport in my app(s) that use this custom middleware. I believe I can do the following to achieve this. Is this proper? Is there a better way to do this?

someModule.js

var express = require('express'),
    passport = require('passport');

exports.someMiddleware = function(app) {
  app.use(passport.initialize());
  app.use(passport.session());
  return function(req, res, next) {
    // Do something
    next();
  }
}

app.js

var express = require('express');

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

app = express();

app.use(someModule.someMiddleware(app))

rather than......

someModule.js

var express = require('express'),
    passport = require('passport');

exports.someMiddleware = function(app) {
  return function(req, res, next) {
    // Do something
    next();
  }
}

app.js

var express = require('express'),
    passport = require('passport');

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

app = express();

app.use(passport.initialize());
app.use(passport.session());
app.use(someModule.someMiddleware())

Upvotes: 2

Views: 147

Answers (1)

wprl
wprl

Reputation: 25397

I recommend using embedded apps to keep code well organized and reusable. Keep routes in the embedded app as short as possible, so that the main app that is using them can set an appropriate base path.

module.js

var express = require('express');
var passport = require('passport');

var controller = module.exports = express();
controller.use(passport.initialize());
controller.use(passport.session());
// Login
controller.post('/', function (request, response, next) { /* ... */ });
// Logout
controller.del('/', function (request, response, next) { /* ... */ });

app.js

var app = express();
var controller = require('./controllers/module');

app.use('/authentication', controller);

Upvotes: 1

Related Questions