一、 中間件概念
所謂中間件就是在收到請求後和發送響應之前的過程中執行的一系列函數。中間件接收(req, res, next)作爲參數。
req和res分別爲resquest和response,next()方法表示執行完當前中間件後進入下一個中間件。
中間件的主要行爲:
- 執行任意代碼
- 改變
request
和response
對象 - 結束請求-響應調用連
- 調用堆中的下一個中間件
如果當前中間件不會結束響應,則必須調用next()
進入下一個中間件,否則請求會被掛起(next(err)
除外)。
中間件使用示例
let express = require('express')
let app = express()
let requestTime = function (req, res, next) {
req.requestTime = new Date().toISOString();
String();
next()
}
app.use(requestTime) // requestTime 中間件在req中添加了requestTime的屬性。
app.get('/', function (req, res) {
let responseText = 'Hello World!<br>'
responseText += '<small>Requested at: ' + req.requestTime + '</small>'
res.send(responseText)
})
app.listen(3000)
中間件的基本類型
- 應用級中間件
- 路由級中間件
- 錯誤處理中間件
- 內置中間件
- 第三方中間件
1.應用級中間件
示例:
var app = express()
app.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
app.get('/user/:id', function (req, res, next) {
res.send('USER')
})
注意: next('route')
可以跳過下一個路由中間件
。但是隻在app.METHOD()
或者router.METHOD
中有效。
注意: next('router')
可以跳過剩餘的路由中間件
。
2. 路由級中間件
示例代碼
var app = express()
var router = express.Router()
// predicate the router with a check and bail out when needed
router.use(function (req, res, next) {
if (!req.headers['x-auth']) return next('router')
next()
})
router.get('/', function (req, res) {
res.send('hello, user!')
})
// use the router and 401 anything falling through
app.use('/admin', router, function (req, res) {
res.sendStatus(401)
})
3. 錯誤處理中間件
錯誤處理中間件有四個入參(err, req, res, next),有四個入參的就是錯誤處理中間件。
eg:
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
4. 內置中間件
Express的內置中間件函數
中間件函數 | 作用 |
---|---|
express.static | 可以用來處理網站裏的靜態文件的GET請求 |
express.json | parses incoming requests with JSON payloads. (Express 4.16.0+) |
express.urlencoded | parses incoming requests with URL-encoded payloads. ( Express 4.16.0+) |
5. 第三方中間件
npm install <第三方中間件>
Reference :