nodejs(12)Express 中間件middleware

中間件

  客戶端的請求到達服務器時,他的生命週期是:request -- 服務器端處理 -- 響應html

  在服務器端處理過程當中,業務邏輯複雜時,爲了便於開發維護,須要把處理的事情分紅幾步,這裏每一步就是一箇中間件,數據就是中間件的操做對象。程序員

定義:中間件就是一個處理函數;只不過這個函數比較特殊,包含了三個參數,分別是 reqresnextexpress

注意:中間件方法中的三個參數: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')
})

 

Express 框架中對中間件的5種分類

  • 應用級別的中間件: 掛載到 app 上的中間件 app.get('URL地址', (req, res, next)=> {})

  • 路由級別的中間件: 掛載到 router 對象上的中間件 router.get('url地址', (req, res, next)=>{})

  • 錯誤級別的中間件: 回調函數中,有四個參數 app.use((err, req, res, next)=>{})

  • 惟一內置的中間件: express.static()

  • 第三方中間件: 非express框架提供的,須要程序員手動安裝才能使用的中間件;body-parser 解析post 表單數據

使用第三方body-parser

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()
  })
}
相關文章
相關標籤/搜索