中介軟體函數是一些有權存取要求物件 (req
)、回應物件 (res
) 和應用程式要求/回應循環中之下一個中介軟體函數的函數。下一個中介軟體函數通常以名為 next
的變數表示。
中介軟體函數可以執行下列作業:
如果現行中介軟體函數不會結束要求/回應循環,它必須呼叫 next()
,以便將控制權傳遞給下一個中介軟體函數。否則,要求將會停擺。
下列範例顯示中介軟體函數呼叫中的元素:
要套用中介軟體函數的 HTTP 方法。
要套用中介軟體函數的路徑(路由)。
中介軟體函數。
中介軟體函數的回呼引數,依慣例,稱為 "next"。
中介軟體函數的 HTTP response 引數,依慣例,稱為 "res"。
中介軟體函數的 HTTP request 引數,依慣例,稱為 "req"。
|
下列範例顯示簡單的 “Hello World” Express 應用程式,您將為這個應用程式定義兩個中介軟體函數:
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
以下的簡單範例顯示一個稱為 “myLogger” 的中介軟體函數。當透過這個函數將要求傳遞給應用程式時,此函數只會列印 “LOGGED”。中介軟體函數會指派給名為 myLogger
的變數。
var myLogger = function (req, res, next) {
console.log('LOGGED');
next();
};
請注意上述對 next()
的呼叫。呼叫這個函數時,會呼叫應用程式中的下一個中介軟體函數。next()
函數並非 Node.js 或 Express API 的一部分,而是傳遞給中介軟體函數的第三個引數。next()
函數雖沒有命名限制,但依慣例,都是稱為 “next”。為避免混淆,請一律採用此慣例。
若要載入中介軟體函數,請呼叫 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” 訊息列印至終端機。
中介軟體的載入順序很重要:先載入的中介軟體函數也會先執行。
如果 myLogger
是在根路徑路由之後才載入,要求永不會抵達該函數,應用程式也不會列印 “LOGGED”,因為根路徑的路由處理程式會終止要求/回應循環。
中介軟體函數 myLogger
只會列印訊息,然後呼叫 next()
函數,將要求傳遞給堆疊中的下一個中介軟體函數。
下一個範例是在要求物件中新增一個稱為 requestTime
的內容。我們將這個中介軟體函數命名為 “requestTime”。
var requestTime = function (req, res, next) {
req.requestTime = Date.now();
next();
};
現在,應用程式會使用 requestTime
中介軟體函數。此外,根路徑路由的回呼函數會使用中介軟體函數新增至 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!
';
responseText += 'Requested at: ' + req.requestTime + '';
res.send(responseText);
});
app.listen(3000);
當您對應用程式根位置發出要求時,應用程式現在會在瀏覽器中顯示該要求的時間戳記。
由於您有權存取要求物件、回應物件、堆疊中的下一個中介軟體函數,以及整個 Node.js API,因此,中介軟體函數的可能性無止盡。
如需 Express 中介軟體的相關資訊,請參閱:使用 Express 中介軟體。