中間件函數是能夠訪問請求對象(req
)、響應對象(res
)以及應用程序請求—響應週期中的next
函數的函數,next
函數是Express路由器中的一個函數,當被調用時,它會在當前中間件以後執行中間件。git
中間件函數能夠執行如下任務:github
若是當前的中間件函數沒有結束請求—響應週期,它必須調用next()
將控制權傳遞給下一個中間件函數,不然,請求將被掛起。express
下圖顯示了中間件函數調用的元素:segmentfault
如下是一個簡單的「Hello World」 Express應用程序示例,本文的其他部分將爲應用程序定義和添加兩個中間件函數:一個名爲myLogger
,用於打印簡單的日誌消息,另外一個名爲requestTime
,用於顯示HTTP請求的時間戳。瀏覽器
var express = require('express') var app = express() app.get('/', function (req, res) { res.send('Hello World!') }) app.listen(3000)
這是一個名爲「myLogger」的中間件函數的簡單示例,當對應用程序的請求經過時,此函數只打印「LOGGED」,中間件函數被分配給名爲myLogger
的變量。cookie
var myLogger = function (req, res, next) { console.log('LOGGED') next() }
注意上面的調用next()
,調用此函數會調用應用程序中的下一個中間件函數,next()
函數不是Node.js或Express API的一部分,而是傳遞給中間件函數的第三個參數。next()
函數能夠命名爲任何,但按照慣例,它老是被命名爲「next
」,爲避免混淆,請始終使用此約定。
要加載中間件函數,請調用app.use()
,指定中間件函數,例如,如下代碼在到根路徑(/
)的路由以前加載myLogger
中間件函數。session
var express = require('express') var app = express() var myLogger = function (req, res, next) { console.log('LOGGED') next() } app.use(myLogger) app.get('/', function (req, res) { res.send('Hello World!') }) app.listen(3000)
每次應用程序收到請求時,它都會向終端輸出消息「LOGGED」。app
中間件加載的順序很重要:首先加載的中間件函數也會先執行。函數
若是myLogger
在到達根路徑的路由以後加載,則請求永遠不會到達它,而且應用程序不會打印「LOGGED」,由於根路徑的路由處理程序會終止請求—響應週期。ui
中間件函數myLogger
只是打印一條消息,而後經過調用next()
函數將請求傳遞給堆棧中的下一個中間件函數。
接下來,咱們將建立一個名爲「requestTime」的中間件函數,並將一個名爲requestTime
的屬性添加到請求對象中。
var requestTime = function (req, res, next) { req.requestTime = Date.now() next() }
該應用程序如今使用requestTime
中間件函數,此外,根路徑路由的回調函數使用中間件函數添加到req(請求對象)的屬性。此外,根路徑路由的回調函數使用中間件函數添加到req
(請求對象)的屬性。
var express = require('express') var app = express() var requestTime = function (req, res, next) { req.requestTime = Date.now() next() } app.use(requestTime) app.get('/', function (req, res) { var responseText = 'Hello World!<br>' responseText += '<small>Requested at: ' + req.requestTime + '</small>' res.send(responseText) }) app.listen(3000)
當你嚮應用程序的根目錄發出請求時,應用程序如今會在瀏覽器中顯示你的請求的時間戳。
由於你能夠訪問請求對象、響應對象、堆棧中的下一個中間件函數以及整個Node.js API,因此中間件函數的可能性是無窮無盡的。
有關Express中間件的更多信息,請參閱:使用Express中間件。
若是你須要中間件可配置,請導出一個接受選項對象或其餘參數的函數,而後根據輸入參數返回中間件實現。
文件:my-middleware.js
module.exports = function(options) { return function(req, res, next) { // Implement the middleware function based on the options object next() } }
如今可使用中間件,以下所示。
var mw = require('./my-middleware.js') app.use(mw({ option1: '1', option2: '2' }))
有關可配置中間件的示例,請參閱cookie-session和compression。