StrongLoop 提供的 Express 和 Node.js 訓練課程

這個翻譯StrongLoop / IBM提供.

相對於英文版說明文件,本文件可能已不合時宜。如需最新的更新,請參閱英文版說明文件

撰寫中介軟體以用於 Express 應用程式中

概觀

中介軟體函數是一些有權存取要求物件 (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 中介軟體