什麼是Express中介軟體?Node中要怎麼使用?

2022-02-10 19:00:26
什麼是Express中介軟體?中要怎麼使用?下面本篇文章就來給大家介紹一下Express中介軟體的簡單使用方法,希望對大家有所幫助!

一、什麼是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官方內建的,而是由第三方開發出來的中介軟體,叫做第三方中介軟體。在專案中,大家可以按需下載並設定第三方中介軟體,從而提高專案的開發效率。 例如:在[email protected]之前的版本中,經常使用body-parser這個第三方中介軟體,來解析請求體資料。使用步驟如下:

    • 執行npm install body-parser安裝中介軟體

    • 使用require匯入中介軟體

    • 呼叫server.use()註冊並使用中介軟體

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

更多node相關知識,請存取:!

以上就是什麼是Express中介軟體?Node中要怎麼使用?的詳細內容,更多請關注TW511.COM其它相關文章!