中介軟體特指業務流程的中間處理環節。
當一個請求到達Express 的伺服器之後,可以連續呼叫多箇中介軟體,從而對這次請求進行預處理。
本質上就是function處理常式
注意:中介軟體函數的形參列表中,必須包含next引數。而路由處理常式中只包含req和res,
// next引數必須在最後一個傳入 const mw = (req, res, 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() }
一定要在路由之前註冊中介軟體
使用者端傳送過來的請求,可以連續呼叫多箇中介軟體進行處理
執行完中介軟體的業務程式碼之後,不要忘記呼叫next()函數
為了防止程式碼邏輯混亂,呼叫next()函數後不要再寫額外的程式碼
連續呼叫多箇中介軟體時,多箇中介軟體之間,共用req和res物件
應用級別的中介軟體
路由級別的中介軟體
錯誤級別的中介軟體
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其它相關文章!