使用中間件
Express是一種路由和中間件Web框架,它具有自己的最小功能:Express應用程序本質(zhì)上是一系列中間件函數(shù)調(diào)用。
中間件函數(shù)是可以訪問請求對象 (req),響應對象(res)以及應用程序的請求 - 響應周期中的下一個中間件函數(shù)的函數(shù)。下一個中間件函數(shù)通常由名為的變量表示next。
中間件功能可以執(zhí)行以下任務:
- 執(zhí)行任何代碼。
- 更改請求和響應對象。
- 結(jié)束請求 - 響應周期。
- 調(diào)用堆棧中的下一個中間件函數(shù)。
如果當前的中間件函數(shù)沒有結(jié)束請求 - 響應周期,則必須調(diào)用next()以將控制傳遞給下一個中間件函數(shù)。否則,請求將被掛起。
Express應用程序可以使用以下類型的中間件:
- 應用程序級中間件
- 路由器級中間件
- 錯誤處理中間件
- 內(nèi)置中間件
- 第三方中間件
您可以使用可選的裝載路徑加載應用程序級和路由器級中間件。您還可以將一系列中間件功能加載在一起,從而在安裝點創(chuàng)建中間件系統(tǒng)的子堆棧。
應用程序級中間件
通過使用和函數(shù)將應用程序級中間件綁定到
app對象的實例,其中是中間件函數(shù)以小寫形式處理的請求的HTTP方法(例如GET,PUT或POST)。app.use()、app.METHOD()
此示例顯示了沒有裝載路徑的中間件功能。每次應用程序收到請求時都會執(zhí)行該功能。
var app = express()
app.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
復制代碼
此示例顯示了/user/:id路徑上安裝的中間件功能。對/user/:id路徑上的任何類型的HTTP請求執(zhí)行該函數(shù)。
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
復制代碼
此示例顯示了路由及其處理函數(shù)(中間件系統(tǒng))。該函數(shù)處理對/user/:id路徑的GET請求。
app.get('/user/:id', function (req, res, next) {
res.send('USER')
})
復制代碼
下面是一個使用掛載路徑在掛載點加載一系列中間件函數(shù)的示例。它說明了一個中間件子堆棧,它將任何類型的HTTP請求的請求信息打印到/user/:id路徑。
app.use('/user/:id', function (req, res, next) {
console.log('Request URL:', req.originalUrl)
next()
}, function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
復制代碼
路徑處理程序使您可以為路徑定義多個路徑。下面的示例為/user/:id路徑的GET請求定義了兩個路由。第二個路由不會引起任何問題,但它永遠不會被調(diào)用,因為第一個路由結(jié)束了請求 - 響應周期。
此示例顯示了一個中間件子堆棧,用于處理對/user/:id路徑的GET請求。
app.get('/user/:id', function (req, res, next) {
console.log('ID:', req.params.id)
next()
}, function (req, res, next) {
res.send('User Info')
})
// user/:id路徑的處理程序,用于打印用戶標識
app.get('/user/:id', function (req, res, next) {
res.end(req.params.id)
})
復制代碼
要從路由器中間件堆棧中跳過其余的中間件功能,請調(diào)用next('route')將控制權(quán)傳遞給下一個路由。 注意:next('route')僅適用于使用app.METHOD()或router.METHOD()函數(shù)加載的中間件函數(shù)。
此示例顯示了一個中間件子堆棧,用于處理對/user/:id路徑的GET請求。
app.get('/user/:id', function (req, res, next) {
// 如果用戶ID為0,則跳到下一個路由
if (req.params.id === '0') next('route')
// 否則將控件傳遞給此堆棧中的下一個中間件函數(shù)
else next()
}, function (req, res, next) {
// 返回數(shù)據(jù)信息
res.send('regular')
})
// user/:id路徑的處理程序,它發(fā)送一個特殊的響應
app.get('/user/:id', function (req, res, next) {
res.send('special')
})
復制代碼
路由器級中間件
路由器級中間件的工作方式與應用程序級中間件的工作方式相同,但它綁定到的是一個實例
express.Router()。
var router = express.Router()
使用router.use()和router.METHOD()函數(shù)加載路由器級中間件。
以下示例代碼通過使用路由器級中間件復制上面顯示的應用程序級中間件的中間件系統(tǒng):
var app = express()
var router = express.Router()
// 沒有掛載路徑的中間件功能。 對于路由器的每個請求都執(zhí)行此代碼
router.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
// 對/ user/:id路徑的任何類型的HTTP請求的都會執(zhí)行
router.use('/user/:id', function (req, res, next) {
console.log('Request URL:', req.originalUrl)
next()
}, function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
// 用于處理對/ user /:id路徑的GET請求
router.get('/user/:id', function (req, res, next) {
// 如果用戶ID為0,則跳到下一個路由器
if (req.params.id === '0') next('route')
// 否則將執(zhí)行下一個中間件函數(shù)
else next()
}, function (req, res, next) {
// 渲染regular頁面
res.render('regular')
})
// / user /:id路徑的處理程序,它會渲染頁面
router.get('/user/:id', function (req, res, next) {
console.log(req.params.id)
res.render('special')
})
// 初始化引入router中間件
app.use('/', router)
復制代碼
要跳過路由器中間件的其余功能,請調(diào)用next('router') 將控制權(quán)交還給路由器實例。
此示例顯示了一個中間件子堆棧,用于處理對/user/:id路徑的GET請求。
var app = express()
var router = express.Router()
// 在需要時對路由器的檢查
router.use(function (req, res, next) {
if (!req.headers['x-auth']) return next('router')
next()
})
router.get('/', function (req, res) {
res.send('hello, user!')
})
// 使用路由器和設置請求結(jié)果狀態(tài)碼
app.use('/admin', router, function (req, res) {
res.sendStatus(401)
})
復制代碼
錯誤處理中間件
錯誤處理中間件總是需要
四個參數(shù)。您必須提供四個參數(shù)以將其標識為錯誤處理中間件函數(shù)。即使您不需要使用該next對象,也必須指定它以保持簽名。否則,該next對象將被解釋為常規(guī)中間件,并且將無法處理錯誤。
以與其他中間件函數(shù)相同的方式定義錯誤處理中間件函數(shù),除了四個參數(shù)而不是三個,特別是簽名(err, req, res, next)):
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
復制代碼
有關錯誤處理中間件的詳細信息,請參閱:錯誤處理。
內(nèi)置中間件
從版本4.x開始,
Express不再依賴于Connect。之前包含在Express中的中間件功能現(xiàn)在位于單獨的模塊中; 查看中間件功能列表。
Express具有以下內(nèi)置中間件功能:
-
express.static提供靜態(tài)資源,如HTML文件,圖像等。 -
express.json使用JSON有效負載解析傳入的請求。注意:適用于Express 4.16.0+ -
express.urlencoded用URL編碼的有效負載解析傳入的請求。 注意:適用于Express 4.16.0+
第三方中間件
使用第三方中間件為
Express應用程序添加功能。
安裝Node.js模塊以獲得所需的功能,然后在應用程序級別或路由器級別將其加載到您的應用程序中。
以下示例說明了安裝和加載cookie解析中間件功能cookie-parser。
$ npm install cookie-parser
var express = require('express')
var app = express()
var cookieParser = require('cookie-parser')
// 加載cookie解析中間件
app.use(cookieParser())
復制代碼
結(jié)尾
參考資料:點擊更多