Express 文檔(編寫中間件)

編寫中間件

中間件函數是能夠訪問請求對象(req)、響應對象(res)以及應用程序請求—響應週期中的next函數的函數,next函數是Express路由器中的一個函數,當被調用時,它會在當前中間件以後執行中間件。git

中間件函數能夠執行如下任務:github

  • 執行任何代碼。
  • 更改請求和響應對象。
  • 結束請求—響應週期。
  • 調用堆棧中的下一個中間件。

若是當前的中間件函數沒有結束請求—響應週期,它必須調用next()將控制權傳遞給下一個中間件函數,不然,請求將被掛起。express

下圖顯示了中間件函數調用的元素:segmentfault

clipboard.png

示例

如下是一個簡單的「Hello World」 Express應用程序示例,本文的其他部分將爲應用程序定義和添加兩個中間件函數:一個名爲myLogger,用於打印簡單的日誌消息,另外一個名爲requestTime,用於顯示HTTP請求的時間戳。瀏覽器

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)

中間件函數myLogger

這是一個名爲「myLogger」的中間件函數的簡單示例,當對應用程序的請求經過時,此函數只打印「LOGGED」,中間件函數被分配給名爲myLogger的變量。cookie

var myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}
注意上面的調用 next(),調用此函數會調用應用程序中的下一個中間件函數, next()函數不是Node.js或Express API的一部分,而是傳遞給中間件函數的第三個參數。 next()函數能夠命名爲任何,但按照慣例,它老是被命名爲「 next」,爲避免混淆,請始終使用此約定。

要加載中間件函數,請調用app.use(),指定中間件函數,例如,如下代碼在到根路徑(/)的路由以前加載myLogger中間件函數。session

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」。app

中間件加載的順序很重要:首先加載的中間件函數也會先執行。函數

若是myLogger在到達根路徑的路由以後加載,則請求永遠不會到達它,而且應用程序不會打印「LOGGED」,由於根路徑的路由處理程序會終止請求—響應週期。ui

中間件函數myLogger只是打印一條消息,而後經過調用next()函數將請求傳遞給堆棧中的下一個中間件函數。

中間件函數requestTime

接下來,咱們將建立一個名爲「requestTime」的中間件函數,並將一個名爲requestTime的屬性添加到請求對象中。

var requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

該應用程序如今使用requestTime中間件函數,此外,根路徑路由的回調函數使用中間件函數添加到req(請求對象)的屬性。此外,根路徑路由的回調函數使用中間件函數添加到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)

當你嚮應用程序的根目錄發出請求時,應用程序如今會在瀏覽器中顯示你的請求的時間戳。

由於你能夠訪問請求對象、響應對象、堆棧中的下一個中間件函數以及整個Node.js API,因此中間件函數的可能性是無窮無盡的。

有關Express中間件的更多信息,請參閱:使用Express中間件。

可配置的中間件

若是你須要中間件可配置,請導出一個接受選項對象或其餘參數的函數,而後根據輸入參數返回中間件實現。

文件:my-middleware.js

module.exports = function(options) {
  return function(req, res, next) {
    // Implement the middleware function based on the options object
    next()
  }
}

如今可使用中間件,以下所示。

var mw = require('./my-middleware.js')

app.use(mw({ option1: '1', option2: '2' }))

有關可配置中間件的示例,請參閱cookie-sessioncompression


上一篇:路由

下一篇:使用中間件

相關文章
相關標籤/搜索