概述
中間件函數(shù)能夠訪問(wèn)請(qǐng)求對(duì)象?(req
)、響應(yīng)對(duì)象?(res
) 以及應(yīng)用程序的請(qǐng)求/響應(yīng)循環(huán)中的下一個(gè)中間件函數(shù)。下一個(gè)中間件函數(shù)通常由名為?next
?的變量來(lái)表示。
中間件函數(shù)可以執(zhí)行以下任務(wù):
- 執(zhí)行任何代碼。
- 對(duì)請(qǐng)求和響應(yīng)對(duì)象進(jìn)行更改。
- 結(jié)束請(qǐng)求/響應(yīng)循環(huán)。
- 調(diào)用堆棧中的下一個(gè)中間件。
如果當(dāng)前中間件函數(shù)沒(méi)有結(jié)束請(qǐng)求/響應(yīng)循環(huán),那么它必須調(diào)用?next()
,以將控制權(quán)傳遞給下一個(gè)中間件函數(shù)。否則,請(qǐng)求將保持掛起狀態(tài)。
以下示例顯示中間件函數(shù)調(diào)用的元素:
|
中間件函數(shù)適用的 HTTP 方法。 中間件函數(shù)適用的路徑(路由)。 中間件函數(shù)。 中間件函數(shù)的回調(diào)自變量,按約定稱(chēng)為“next”。 中間件函數(shù)的 HTTP?響應(yīng)自變量,按約定稱(chēng)為“res”。 中間件函數(shù)的 HTTP?請(qǐng)求自變量,按約定稱(chēng)為“req”。 |
以下是“Hello World”Express 應(yīng)用程序的簡(jiǎn)單示例,將為其定義兩個(gè)中間件函數(shù):
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
開(kāi)發(fā)
以下是稱(chēng)為“myLogger”的中間件函數(shù)的簡(jiǎn)單示例。此函數(shù)僅在應(yīng)用程序的請(qǐng)求通過(guò)它時(shí)顯示“LOGGED”。中間件函數(shù)會(huì)分配給名為?myLogger
的變量。
var myLogger = function (req, res, next) {
console.log('LOGGED');
next();
};
請(qǐng)注意以上對(duì)?next()
?的調(diào)用。調(diào)用此函數(shù)時(shí),將調(diào)用應(yīng)用程序中的下一個(gè)中間件函數(shù)。?next()
?函數(shù)不是 Node.js 或 Express API 的一部分,而是傳遞給中間件函數(shù)的第三自變量。next()
?函數(shù)可以命名為任何名稱(chēng),但是按約定,始終命名為“next”。為了避免混淆,請(qǐng)始終使用此約定。
要裝入中間件函數(shù),請(qǐng)調(diào)用?app.use()
?并指定中間件函數(shù)。 例如,以下代碼在根路徑 (/) 的路由之前裝入?myLogger
?中間件函數(shù)。
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);
應(yīng)用程序每次收到請(qǐng)求時(shí),會(huì)在終端上顯示消息“LOGGED”。
中間件裝入順序很重要:首先裝入的中間件函數(shù)也首先被執(zhí)行。
如果在根路徑的路由之后裝入?myLogger
,那么請(qǐng)求永遠(yuǎn)都不會(huì)到達(dá)該函數(shù),應(yīng)用程序也不會(huì)顯示“LOGGED”,因?yàn)楦窂降穆酚商幚沓绦蚪K止了請(qǐng)求/響應(yīng)循環(huán)。
中間件函數(shù)?myLogger
?只是顯示消息,然后通過(guò)調(diào)用?next()
?函數(shù)將請(qǐng)求傳遞到堆棧中的下一個(gè)中間件函數(shù)。
下一個(gè)示例將名為?requestTime
?的屬性添加到請(qǐng)求對(duì)象。我們將此中間件函數(shù)命名為“requestTime”。
var requestTime = function (req, res, next) {
req.requestTime = Date.now();
next();
};
現(xiàn)在,該應(yīng)用程序使用?requestTime
?中間件函數(shù)。此外,根路徑路由的回調(diào)函數(shù)使用由中間件函數(shù)添加到?req
(請(qǐng)求對(duì)象)的屬性。
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!';
responseText += 'Requested at: ' + req.requestTime + '';
res.send(responseText);
});
app.listen(3000);
您向應(yīng)用程序根發(fā)出請(qǐng)求時(shí),此應(yīng)用程序當(dāng)前在瀏覽器中顯示請(qǐng)求的時(shí)間戳記。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-693811.html
因?yàn)槟鷵碛姓?qǐng)求對(duì)象、響應(yīng)對(duì)象、堆棧中的下一個(gè)中間件函數(shù)以及整個(gè) Node.js API 的訪問(wèn)權(quán),所以中間件函數(shù)的可能性是無(wú)窮的。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-693811.html
到了這里,關(guān)于編寫(xiě)中間件以用于 Express 應(yīng)用程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!