Search code examples
javascriptnode.jsexpressmiddleware

Express: abstracting away middleware for app.use


I want to go from this code in my index.js

app.use(require('sass-middleware').middleware({
  src: path.resolve(__dirname, '../'),
  dest: path.resolve(__dirname, '../public')
}));
app.use(require('browserify-dev-middleware')({
  src: path.resolve(__dirname, '../'),
  transforms: [require('jadeify')]
}));

to this:

app.use(require('asset-pipeline-dev-middelware'));

but I just don't know how to make the function that is passed in to app.use be a proxy for the other two middleware functions.

Something like this fills wrong, or is it fine?

require('asset-pipeline-dev-middelware')(app);

Solution

  • You can group the middlewares like this:

    //asset-pipeline-dev-middelware.js
    var middleware1 = require('first-middleware')
    var middleware2 = require('second-middleware')
    
    function(req, res, next){
        middleware1(req, res, function(err){
            if(err) return next(err);
            middleware2(req, res, next)
        })
    }
    

    then use it in app just like you mentioned:

    app.use(require('asset-pipeline-dev-middelware'));