2013-10-26 69 views
0

思考正確的方式,如何利用正在成長的當前正在成長的express和connect在node.js web項目中使用中間件。什麼是使用快遞和連接在節點中使用中間件的最常見方式

當然,現在有很多中間件需要在全局範圍內傳遞或擴展請求,但在很多情況下,還有一些特殊的工作需要準備傳入數據,在這種情況下,中間件只能用於一組http方法,路線。

我有一個基於組件的架構,每個組件都帶有它自己的中間件層,它可以實現這些組件可以處理的請求。在應用程序啓動時,加載和準備所有必需的組件。將中間件代碼執行綁定到URL以保持cpu加載更低還是僅將中間件用於全局目的更好?

下面是一些關於中間件相關URL的虛擬方法。

app.use(function(req, res, next) {    

     // Check if requested route is a part of the current component 
     // or if the middleware should be passed on any request 
     if (APP.controller.groups.Component.isExpectedRoute(req) || 
      APP.controller.groups.Component.getConfig().MIDDLEWARE_PASS_ALL === true) { 
       // Execute the midleware code here 
       console.log('This is a route which should be afected by middleware'); 
       ... 
       next();      
      }else{ 
       next(); 
      } 
     }); 

回答

0

這取決於您的設置,但您可以具有創意。

假設您想運行某個中間件以處理GET請求,並且前綴爲/foo。在這種情況下,你可以使用這樣的限制調用中間件的數量:

// matches '/foo', '/foo/bar', '/foo/bar/blah', ... 
app.get('/foo*', YourMiddleware); 

(與app.all取代app.get通過中間件等,通過所有請求方法)

如果你想運行的中間件只有有限數量的(一個或兩個)具體路線,你可以在路徑聲明中注入它:

app.get('/bar', YourMiddleware, function(req, res) { 
    ... 
}); 

如果你有中間件的特定集合,你可以創建它們的陣列,您可以使用類似的方法:

var MiddlewareSet = [ MiddlewareA, MiddlewareB, MiddlewareC ]; 
... 
app.get('/', MiddlewareSet, function(req, res) { 
    ... 
}); 
+0

這是一種很好的方法。這是「APP.controller.groups.Component.isExpectedRoute(req)」更好的替代方案。但是,我們如何管理「APP.controller.groups.Component.getConfig()。MIDDLEWARE_PASS_ALL === true」? –

+0

@hilarudeens現在正在考慮同樣的問題,但這是一個我可以解決的問題。 app.get('/',...事情是在應用程序啓動時自動完成的,所以我只需要在MIDDLEWARE_PASS_ALL === true – Bernhard

+0

@robertklep之間做出區別非常感謝,這給了我以前沒有的看法:-) – Bernhard

0

這就像概率。讓我們假設,有10個URL,你的中間件將被執行7或8個URL。那麼更好的主意是,使用全局中間件或以其他方式將它們用作普通函數。

當然,你可以這樣做。但願沒有大的表現的變化,因爲有一些原因,你要想想,

  1. 與PHP,Node.js的應用程序讀取所有的代碼將它們存儲它的內存時,應用程序啓動。所以沒有運行時包含代碼。

  2. 任何你必須通過使用某個函數(中間件函數)來停止塊執行的方法。該功能可以做實際操作或檢查網址是否有資格進行實際操作或不(像在您的文章的代碼)

注:不管是什麼,你的代碼應該是可讀的,有意義的,旨在完整的操作

注意***:更重要的是你不能避免cpu加載「Javascript/Node.JS」。但是,您可以通過儘可能將所有變量保持在本地範圍內來進行管理。所以,內置的垃圾收集器對你的效果也一樣。

相關問題