首頁 > web前端 > js教程 > 什麼是Express中間件? Node要怎麼使用?

什麼是Express中間件? Node要怎麼使用?

青灯夜游
發布: 2022-02-10 19:01:35
轉載
2092 人瀏覽過

什麼是Express中間件? Node要怎麼使用?以下這篇文章就來跟大家介紹一下Express中間件的簡單使用方法,希望對大家有幫助!

什麼是Express中間件? Node要怎麼使用?

一、什麼是Express中間件

中間件特別指業務流程的中間處理環節。

二、Express中間件的呼叫流程

當一個請求到達Express 的伺服器之後,可以連續呼叫多個中間件,從而對這次請求進行預處理。

三、中間件格式

本質上就是function處理函數

注意:中間件函數的形參列表中,必須包含next參數。而路由處理函數中只包含req和res,

// next参数必须在最后一个传入
const mw = (req, res, next) => {
    ...
    // next()必须在最后调用
    next()
}
登入後複製

四、next()函數的作用

next函數是實現多個中間件連續呼叫的關鍵,它表示把流轉關係轉交給下一個中間件或路由。

五、全域生效的中間件

客戶端發起的任何請求,到達伺服器之後,都會觸發的中間件,叫做全域生效的中間件。 透過呼叫server.use(中間件函數),即可定義一個全域生效的中間件,範例程式碼如下:

const mw = (req, res, next) => {
    next()
}

const mw1 = (req, res, next) => {
    next()
}

// 全局生效的中间件,中间件调用顺序以传入顺序为准
server.use(mw,mw1)
登入後複製

六、局部生效的中間件

#局部中間件只在某一個指定的路由路徑生效

const mw = (req, res, next) => {
    next()
}
const mw1 = (req, res, next) => {
    next()
}
// 局部生效的中间件
server.get('/',mw,(req,res)=>{
    res.send('路径:/')
})



// 定义多个局部生效的中间件
// 1、直接逗号分隔
server.get('/',mw,mw1,(req,res)=>{
    res.send('路径:/')
})
// 2、或者使用数组包含
server.get('/',[mw,mw1],(req,res)=>{
    res.send('路径:/')
})
登入後複製

七、中間件的作用

多個中間件之間,共享同一份req和res。基於這樣的特性,我們可以在上游的中間件中,統一為req或 res物件添加自訂的屬性或方法,供下游的中間件或路由進行使用。

const mw = (req, res, next) => {
    // 添加属性
    req.startTime=new Date()
    next()
}
登入後複製

八、Express中間件的五個注意點

  • #一定要在路由之前註冊中間件

  • 客戶端傳送過來的請求,可以連續呼叫多個中間件進行處理

  • #執行完中間件的業務程式碼之後,不要忘記呼叫next()函數

  • 為了防止程式碼邏輯混亂,當呼叫next()函數後不要再寫額外的程式碼

  • 連續呼叫多個中間件時,多個中間件之間,共享req和res物件

九、Express中間件的分類

  • 應用級別的中間件

  • 路由層級的中間件

  • #錯誤層級的中間件

  • ##Express內建的中間件

  • 第三方的中間件

#詳細介紹:

    ##應用程式級別的中間件
  • 透過app.use()或app.get()或app.post(),綁定到app實例上的中間件,叫做應用層級的中間件,程式碼範例如下:

    // 全局生效的中间件(应用级别的中间件)
    server.use(mw,mw1)
    // 局部生效的中间件(应用级别的中间件)
    server.get('/',mw,mw1,(req,res)=>{
        res.send(`请求进入服务器的时间:${req.startTime}`)
    })
    登入後複製

  • 路由層級的中間件
  • 綁定到express.Router()實例上的中間件,叫做路由層級的中間件。它的用法和應用級別中間件沒有任何區別。只不過,應用層級中間件是綁定到app實例上,路由層級中間件綁定到router實例上,程式碼範例如下:

    const router = require('./router/router')
    // 路由级别的中间件
    router.use((req,res,next)=>{
        next()
    })
    登入後複製

  • 錯誤層級的中間件
  • 錯誤等級中間件的作用:專門用來捕捉整個專案中發生的異常錯誤,從而防止專案異常崩潰的問題。

    格式∶錯誤等級中間件的 function處理函數中,必須有4個形參,形參順序從前到後,分別是(err, req, res, next)。

    注意:錯誤等級的中間件,必須註冊在所有路由之後!

    // 人为制造错误
    server.get('/err', (req, res) => {
        throw new Error('人为抛出错误!!!')
        res.send('err Page')
    })
    // 定义错误级别的中间件
    server.use((err, req, res, next) => {
        console.log('发生了错误:' + err.message);
        res.send('Error:'+err.message)
        next()
    })
    登入後複製

  • Express內建的中間件
  • 自Express 4.16.0版本開始,Express 內建了3個常用的中間件,極大的提高了Express專案的開發效率和體驗:

      express.static快速託管靜態資源的內建中間件,例如:HTML檔、圖片、CSS樣式等(無相容性)
    • #express.json解析JSON格式的請求體資料(有相容性,僅在4.16.0 版本中可用)
    • express.urlencoded解析URL-encoded格式的請求體資料(有相容性,僅在4.16.0 版本中可用)
    • // 配置解析application/json格式数据的内置中间件
      server.use(express.json())
      // 配置解析application/x-www-form-urlencoded格式数据的内置中间件
      server.use(express.urlencoded({
          extended: false
      }))
      // 测试解析json的内置中间件
      server.post('/user',(req,res)=>{
          // 在服务器,可以使用req.body这个属性来接受客户端发送过来的请求数据
          // 默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
          console.log(req.body);
          res.send('ok')
      })
      
      // 测试解析urlencoded的内置中间件
      server.post('/book',(req,res)=>{
          console.log(req.body)
          res.send('book ok')
      })
      登入後複製
      第三方的中間件
    • 非Express官方內建的,而是由第三方開發出來的中間件,叫做第三方中間件。在專案中,大家可以按需下載並配置第三方中間件,從而提高專案的開發效率。 例如:在

      express@4.16.0

      之前的版本中,常使用body-parser這個第三方中間件,來解析請求體資料。使用步驟如下:

        執行
      • npm install body-parser

        #安裝中間件

      • 使用require匯入中間件
      • 呼叫
      • server.use()

        註冊並使用中間件

      注意:Express 內建的express.urlencoded 中介軟體,就是基於body-parser這個第三方中介軟體進一步封裝出來的。

    • 更多node相關知識,請造訪:nodejs 教學

      以上是什麼是Express中間件? Node要怎麼使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板