2012-07-04 72 views

回答

221

應用程序對象在創建Express服務器時被實例化。它有一個中間件堆棧可以在app.configure()(this is now deprecated in version 4.x)定製。

要設置您的中間件,您可以爲要添加的每個中間件層調用app.use(<specific_middleware_layer_here>)(它可以是所有路徑通用的,或者僅在您的服務器處理的特定路徑上觸發),並且它將添加到您的Express中間件堆棧。可以在多個調用use中逐個添加中間件層,或者甚至可以一次與一個調用串行地添加中間件層。 有關更多詳細信息,請參見use documentation

要給出快遞中間件的概念理解的例子,這裏是我的應用中間件堆棧(app.stack)看起來登錄我的應用程序對象時控制檯爲JSON,如:

stack: 
    [ { route: '', handle: [Function] }, 
    { route: '', handle: [Function: static] }, 
    { route: '', handle: [Function: bodyParser] }, 
    { route: '', handle: [Function: cookieParser] }, 
    { route: '', handle: [Function: session] }, 
    { route: '', handle: [Function: methodOverride] }, 
    { route: '', handle: [Function] }, 
    { route: '', handle: [Function] } ] 

,你可能會能夠推斷,我打電話給app.use(express.bodyParser())app.use(express.cookieParser())等,它們將這些快遞中間件的'圖層'添加到中間件堆棧中。請注意,路由是空白的,這意味着當我添加了那些中間件層時,我指定它們在任何路由上被觸發。如果我添加了一個只在路徑/user/:id上觸發的自定義中間件層,該路徑將在上面的堆棧打印輸出中的該中間件層對象的route字段中反映爲字符串。

每一層本質上都是添加一個函數,該函數專門處理通過中間件的流。

例如,通過添加bodyParser,,您可以確保您的服務器通過快遞中間件處理傳入請求。因此,現在解析傳入請求的主體是您的中間件在處理傳入請求時所需的過程的一部分--全部因爲您稱爲app.use(bodyParser)

+66

謝謝。明確的人會在他們的API文檔中解釋這一點很困難嗎? – ericsoco

+4

所以你說當接收到一個請求時,數據會在實際服務之前通過這些解析器,例如:Valid Request-> Authentication-> ProcessesRequest-> ServResponse ** USE **將按特定順序控制這些步驟,而不是並行執行它們? –

+1

因此,app.use()依賴注入是否有效? –

34

use是一種配置Express HTTP服務器對象的路由使用的中間件的方法。該方法被定義爲Express基於的Connect的一部分。

+2

來源:https://github.com/senchalabs/connect/blob/master/lib/proto.js#L62 –

+3

而在線文檔在這裏:http://www.senchalabs.org/connect/proto.html# app.use –

+0

如果一個Node中間件實例化對象會有效嗎?這是否意味着每次請求時,該中間件都會實例化新的對象?舊物體是否被丟棄?例如'app.use(function(){var object = new SomeConstructor; next();})' – CMCDragonkai

8

app.use()用於裝入中間件函數或掛載到指定路徑,當基本路徑匹配時執行中間件函數。

例如: 如果正在使用indexRouter.js app.use(),是這樣的:

//indexRouter.js 

var adsRouter = require('./adsRouter.js'); 

module.exports = function(app) { 
    app.use('/ads', adsRouter); 
} 

在上面的代碼app.use()安裝在「/廣告的路徑'到adsRouter.js。現在

在adsRouter.js

// adsRouter.js 

var router = require('express').Router(); 
var controllerIndex = require('../controller/index'); 
router.post('/show', controllerIndex.ads.showAd); 
module.exports = router; 

在adsRouter 。js,路徑將如此 - 廣告'/ ads/show',然後根據controllerIndex.ads.showAd()工作。

app.use([路徑],回調,[回調]): 我們可以在相同的添加回調。

app.use('/test', function(req, res, next) { 

    // write your callback code here. 

    }); 
+0

好了解釋。謝謝 –

+0

歡迎@ Dushyant Joshi –

1

app.use()的作品像:

  1. 請求事件trigered節點HTTP服務器實例。
  2. express 做req對象的一些內部操作。
  3. 這是當 快遞開始做你app.use

這很簡單的事情規定。

只有然後明確會做其他的東西,如路由。

1

中間件是軟件的通用術語,其用來「粘合在一起」,從而 app.use是配置中間件,例如一種方法:解析和處理的請求的主體: app.use(bodyParser。 urlencoded({extended:true})); app.use(bodyParser.json()); 還有你可以在你Express應用程序 只使用閱讀文檔許多中間件: http://expressjs.com/en/guide/using-middleware.html

10

每個app.use(中間件)被稱爲每次請求被髮送到服務器的時間。

0

通過使用app.use()和app.METHOD()函數將應用程序級中間件綁定到應用程序對象的實例,其中METHOD是中間件函數處理的請求的HTTP方法(例如GET ,PUT或POST)小寫。

0

在快遞中,如果我們 從「express」 進口快遞並使用app = express(); 則具有明確

所有功能,如果我們使用app.use()

與任何模塊/中間件功能在整個快遞項目使用的應用程序