中間件:是指業(yè)務(wù)流程的中間處理環(huán)節(jié)糠馆。
上一個(gè)的輸出作為下一級(jí)的輸入
中間件的作用:當(dāng)一個(gè)請(qǐng)求到達(dá)Express的服務(wù)器之后,可以連續(xù)調(diào)用多個(gè)中間件草戈,從而對(duì)這次請(qǐng)求進(jìn)行預(yù)處理
路由的匹配過程:
每當(dāng)一個(gè)請(qǐng)求到達(dá)服務(wù)器之后,需要先經(jīng)過路由的匹配瞎嬉,只有匹配成功之后蝎毡,才會(huì)調(diào)用對(duì)應(yīng)的處理函數(shù)。
在匹配時(shí)氧枣,會(huì)按照路由的順序進(jìn)行匹配沐兵,如果請(qǐng)求類型和請(qǐng)求的URL同時(shí)匹配成功,則Express會(huì)將注冊(cè)請(qǐng)求便监,交給對(duì)應(yīng)的function函數(shù)進(jìn)行處理
? ? 1.按照定義的先后順序進(jìn)行匹配
? ? 2.請(qǐng)求類型和請(qǐng)求的URL同時(shí)匹配成功扎谎,才會(huì)調(diào)用對(duì)應(yīng)的處理函數(shù)。
路由和中間件的區(qū)分
app.get(‘/’,function(req,res,next)=>{
next()? ?//中間件函數(shù)的形參列表中烧董,必須包含next參數(shù)毁靶。而路由處理函數(shù)中只包含req和res。
})
next函數(shù)的作用:
next函數(shù)是實(shí)現(xiàn)多個(gè)中間件連續(xù)調(diào)用的關(guān)鍵它表示把流轉(zhuǎn)關(guān)系轉(zhuǎn)交給下一個(gè)中間件或路由解藻。
全局生效的中間件:
客戶端發(fā)起任何請(qǐng)求老充,到達(dá)服務(wù)器之后,都會(huì)觸發(fā)的中間件螟左,叫做全局生效的中間件
// 常量 mw 所指向的,就是一個(gè)中間件函數(shù)
const mw = function(req,res,next){
console.log('這是掛載全局的中間件’)
next()
}
//全局生效的中間件
app.use(mw)
//簡化版的全局中間件
app.use((req.res.next)=>{next()})
中間件的作用:
多個(gè)中間件之間觅够,共享同一份req和res胶背。基于這樣的特性喘先,我們可以再上游的中間件中钳吟,統(tǒng)一為req和res對(duì)象添加自定義非得屬性或方法,供下游的中間件或路由使用????
多個(gè)中間件:
客戶端請(qǐng)求到達(dá)服務(wù)器之后窘拯,會(huì)按照中間件定義的先后順序依次進(jìn)行調(diào)用红且。
局部中間件:
只會(huì)在當(dāng)前的路由中生效。
const mw = (req,res,next)=>{
console.log('這是中間件函數(shù)')
next()}
app.get('/',mw,(req,res)=>{res.send('局部中間件')})
定義多個(gè)局部中間件:
app.get('/',mw1,mw2,(req,res)=>{res.send('中間件')})
app.get('/',[mw1,mw2],(req,res)=>{res.send('中間件')})