2013-10-13 62 views
1

我想將一系列app.use()調用移入其自己的模塊中。封裝這個最簡單的方法是在出口中公開一個function(app),但我覺得交給app對象是一個不透明的接口太多。Express:撰寫中間件

我想從模塊外部公開一箇中間件app.use()'d。我需要鏈接/撰寫內部使用的中間件。

有沒有一種時尚的方式做到這一點,或替代?最簡單的方法是什麼?任何我應該避免的?

回答

1

縱觀Express(和它所基於的Connect)的代碼,看起來在一塊中間件上調用use並不會以任何方式通知任何事情,所以確實沒有辦法提前編寫任何事情而不通過app。然而,您可以在運行時間進行組合,例如,第一次調用中間件時,組合一些函數並緩存/調用它們。

1

這是我的看法:

// app.js 
... 
app.use(require('./middleware')()); 
... 

// middleware.js 
var express = require('express');  
module.exports = function() { 
    var middleware = [ 
    // list of middleware that you want to have performed: 
    function mymiddleware(req, res, next) { 
     console.log('hello world'); 
     next(); 
    }, 
    express.logger('dev'), 
    express.cookieParser(), 
    express.static(__dirname) 
    ]; 
    return function(req, res, next) { 
    (function iter(i, max) { 
     if (i === max) { 
     return next(); 
     } 
     middleware[i](req, res, iter.bind(this, i + 1, max)); 
    })(0, middleware.length); 
    }; 
}; 

如果您需要在您的自定義中間件訪問的應用程序,你可以通過req.appres.app訪問它。