?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
中間件功能是可以訪問請求對象(req
),響應對象(res
)以及next
應用程序請求 - 響應周期中的函數(shù)。該next
功能是Express路由器中的一項功能,當被調用時,該功能執(zhí)行當前中間件之后的中間件。
中間件功能可以執(zhí)行以下任務:
執(zhí)行任何代碼。
對請求和響應對象進行更改。
結束請求 - 響應循環(huán)。
調用堆棧中的下一個中間件。
如果當前的中間件功能沒有結束請求 - 響應周期,則它必須調用next()
以將控制傳遞給下一個中間件功能。否則,請求將被掛起。
下圖顯示了中間件函數(shù)調用的元素:
適用中間件功能的HTTP方法。中間件功能適用的路徑(路由)。中間件功能。中間件功能的回調參數(shù),按照慣例稱為“下一個”。對中間件功能的HTTP響應參數(shù),按照慣例稱為“res”。中間件功能的HTTP請求參數(shù),按慣例稱為“req”。 |
---|
這是一個簡單的“Hello World”表達應用程序的例子。本文的其余部分將定義并向應用程序添加兩個中間件功能:一個調用myLogger
打印簡單的日志消息,另一個調用requestTime
顯示HTTP請求的時間戳。
var express = require('express')var app = express()app.get('/', function (req, res) { res.send('Hello World!')})app.listen(3000)
這是一個稱為“myLogger”的中間件功能的簡單示例。這個函數(shù)只是在對應用程序的請求通過時打印“LOGGED”。中間件功能被分配給一個名為的變量myLogger
。
var myLogger = function (req, res, next) { console.log('LOGGED') next()}
注意上面的呼叫next()
。調用這個函數(shù)會調用應用程序中的下一個中間件功能。該next()
函數(shù)不是Node.js或Express API的一部分,而是傳遞給中間件功能的第三個參數(shù)。該next()
函數(shù)可以被命名為任何東西,但按照慣例,它總是被命名為“下一個”。為避免混淆,請始終使用此約定。
要加載中間件功能,請調用app.use()
,指定中間件功能。例如,以下代碼會在myLogger
到根路徑(/)的路由之前加載中間件功能。
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”消息。
中間件加載順序非常重要:首先加載的中間件功能也首先執(zhí)行。
如果myLogger
在到根路徑的路由之后加載,請求將永遠達不到它,并且應用程序不會打印“LOGGED”,因為根路徑的路由處理程序會終止請求 - 響應循環(huán)。
中間件功能myLogger
僅打印消息,然后通過調用該next()
函數(shù)將請求傳遞到堆棧中的下一個中間件功能。
接下來,我們將創(chuàng)建一個名為“requestTime”的中間件函數(shù),并將其添加為調用requestTime
請求對象的屬性。
var requestTime = function (req, res, next) { req.requestTime = Date.now() next()}
應用程序現(xiàn)在使用requestTime
中間件功能。此外,根路徑路由的回調函數(shù)使用中間件功能添加到的屬性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)
當您向應用程序的根目錄發(fā)出請求時,應用程序現(xiàn)在會在瀏覽器中顯示請求的時間戳。
因為您可以訪問請求對象,響應對象,堆棧中的下一個中間件功能以及整個Node.js API,所以使用中間件功能的可能性是無限的。
有關Express中間件的更多信息,請參閱:使用Express中間件。
如果您需要中間件可配置,則導出一個接受選項對象或其他參數(shù)的函數(shù),然后根據(jù)輸入?yún)?shù)返回中間件實現(xiàn)。
File: my-middleware.js
module.exports = function(options) { return function(req, res, next) { // Implement the middleware function based on the options object next() } }
現(xiàn)在可以使用中間件,如下所示。
var mw = require('./my-middleware.js')app.use(mw({ option1: '1', option2: '2' }))