客戶端的請求到達服務器時,他的生命週期是:request -- 服務器端處理 -- 響應html
在服務器端處理過程當中,業務邏輯複雜時,爲了便於開發維護,須要把處理的事情分紅幾步,這裏每一步就是一箇中間件,數據就是中間件的操做對象。程序員
express
注意:中間件方法中的三個參數:json
req:請求對象;服務器
res:響應對象;app
next:next是一個函數,next()能夠被調用,表示調用下一個中間件方法;框架
function(req,res,next){ //...咱們本身的邏輯 next(); }
app.use(myrFunc) 要寫在下面兩句的前面函數
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
是由於路由後或請求靜態資源後,一次請求響應的生命週期實質上已經結束,加在這後面進行請求處理,沒有任何意義。post
app.use()就是加載中間件的測試
測試:
const express = require('express') const app = express() // 建立第一個中間件 app.use(function(req, res, next) { console.log('第一個中間件') req.a = 'aaa' next() }) // 建立第二個中間件 不寫 next(),那麼後面註冊的函數就不會執行, app.use(function(req, res, next) { console.log('第二個中間件') res.b = 'bbb' next() }) // 建立第三個中間件 app.use(function(req, res, next) { console.log('第三個中間件') console.log(req.a) console.log(res.b) // 結束中間件的調用 res.send('結束中間件的調用') }) app.listen(3001, function() { console.log('Express server is running at http://127.0.0.1:3001') })
應用級別的中間件: 掛載到 app 上的中間件 app.get('URL地址', (req, res, next)=> {})
;
路由級別的中間件: 掛載到 router 對象上的中間件 router.get('url地址', (req, res, next)=>{})
錯誤級別的中間件: 回調函數中,有四個參數 app.use((err, req, res, next)=>{})
惟一內置的中間件: express.static()
第三方中間件:
const express = require('express') const app = express() // 導入解析表單數據的中間件 const bodyParser = require('body-parser') // 把導入的第三方中間安裝到app身上 app.use(bodyParser.urlencoded({extended: false })) // app.use 就是註冊安裝中間件 app.post('/adduser', (req, res) => { // req.body 上存放的,就是經過 body-parser 解析出來的表單數據 res.json(req.body) }) app.listen(3001, function() { console.log('Express server is running at http://127.0.0.1:3001') })
const express = require('express') const app = express() const myBodyparse = require('./04myBodyparse') // 專門定義一個解析表單數據的中間件 app.use(myBodyparse) app.post('/adduser', (req, res) => { res.send(req.body) }) app.post('/updateuser', (req, res) => { res.send(req.body) }) app.listen(3001, function() { console.log('Express server is running at http://127.0.0.1:3001') })
04myBodyparse.js
const qs = require('querystring') module.exports = function(req, res, next) { let dtStr = '' // 只要有數據到達服務器,就會觸發 data req.on('data', chunk => { dtStr += chunk }) // 只要觸發了 end 事件,就證實數據發送和接收完畢了 req.on('end', () => { const result = qs.parse(dtStr) req.body = result console.log(req.body) next() }) }