中間件是一種可以訪問請(qǐng)求和響應(yīng)對(duì)象的功能,也可以next在應(yīng)用程序的請(qǐng)求-響應(yīng)周期中使用該功能。
在本教程中,我們將學(xué)習(xí)如何在Node.js Express應(yīng)用程序中定義中間件函數(shù),以及如何調(diào)用中間件函數(shù)。
request –是客戶端發(fā)出HTTP請(qǐng)求(例如PUT,GET等)時(shí)到達(dá)Express應(yīng)用程序的HTTP請(qǐng)求。它包含諸如查詢字符串,url參數(shù),標(biāo)頭等屬性。
response–對(duì)象表示Express應(yīng)用程序在收到HTTP請(qǐng)求時(shí)發(fā)送的HTTP響應(yīng)。
next – next用于繼續(xù)中間件堆棧中的下一個(gè)中間件。
request-response cycle(請(qǐng)求-響應(yīng)周期) –從請(qǐng)求打入Express應(yīng)用程序開始,直到響應(yīng)離開該應(yīng)用程序以進(jìn)行請(qǐng)求為止執(zhí)行的操作周期。
中間件堆棧–在請(qǐng)求-響應(yīng)周期中執(zhí)行的中間件功能堆棧。
正如我們?cè)谥虚g件功能的定義中已經(jīng)提到的那樣,它可以訪問請(qǐng)求,響應(yīng)對(duì)象和下一個(gè)功能。
語法與JavaScript函數(shù)的語法相同。它接受請(qǐng)求,響應(yīng)對(duì)象和下一個(gè)函數(shù)作為參數(shù)。
function logger(req, res, next) { }
這里logger是函數(shù)名稱,req是HTTP請(qǐng)求對(duì)象,res是節(jié)點(diǎn)響應(yīng)對(duì)象,next是請(qǐng)求-響應(yīng)周期中的下一個(gè)函數(shù)。
您可以訪問request對(duì)象的所有屬性和方法req。
同樣,您可以訪問response object的所有屬性和方法res。
next()中間件函數(shù)內(nèi)部的調(diào)用函數(shù)是可選的。如果使用next()語句,則在請(qǐng)求-響應(yīng)周期中繼續(xù)執(zhí)行下一個(gè)中間件功能。如果您不調(diào)用next()函數(shù),則給定請(qǐng)求的執(zhí)行將在此處停止。
function logger(req, res, next) { // 您的代碼 next() // 調(diào)用中間件堆棧中的下一個(gè)函數(shù) }
在Express應(yīng)用程序中,您可以使用應(yīng)用程序?qū)ο笊系膗se函數(shù)來調(diào)用中間件。
var express = require('express') var app = express() function logger(req, res, next) { // 您的代碼 next() } app.use(logger)
在此示例中,我們將定義一個(gè)名為logger的中間件,該中間件將當(dāng)前時(shí)間和查詢字符串記錄到控制臺(tái)。
app.js
var express = require('express') var app = express() // 定義中間件功能 function logger(req, res, next) { console.log(new Date(), req.url) next() } // 在每個(gè)請(qǐng)求-響應(yīng)周期中調(diào)用logger:middleware app.use(logger) // 為路徑“ /”執(zhí)行的路由 app.get('/', function (req, res) { res.send('This is a basic Example for Express.js by nhooo') }) // 啟動(dòng)服務(wù)器 var server = app.listen(8000, function(){ console.log('Listening on port 8000...') })
啟動(dòng)此應(yīng)用程序,然后在瀏覽器中單擊以下URL。
http://localhost:8000/
http://localhost:8000/hello-page/
輸出將是
對(duì)于監(jiān)聽8000的應(yīng)用程序的每個(gè)請(qǐng)求,我們都附加了一個(gè)中間件功能。對(duì)于url http://localhost:8000/,URL為/ ,因此logger的輸出為當(dāng)前時(shí)間和'/'。對(duì)于url同樣如此'/hello-page/'。