執行在服務端的JavaScript——node.js(五)
中介軟體
中間接的概念
Express 中介軟體的呼叫流程
當一個請求到達Express的伺服器之後,可以連續呼叫多箇中間件,從而對這次請求進行預處理。
Express中介軟體的格式
Express的中介軟體,本質上就是function處理函式,Express中介軟體的格式如下:
中介軟體函式的形參列表中,必須包含next引數。而路由處理函式中只包含req和resnext函式的作用
next函式是實現多箇中間連續呼叫的關鍵,它表示把流轉關係轉交給下一個中介軟體或路由。
Express 中介軟體的初體驗
定義中介軟體函式
可以通過如下方式,定義一個最簡單的中介軟體函式:
// 常量 mw 所指向的,就是一箇中間件函式 const mw = function(req,res,next){ console.log('這是一個最簡單的中介軟體函式'); // 注意:當前中介軟體的業務處理完畢後,必須呼叫next()函式 // 表示把流轉關係轉交給下一個中介軟體或路由 next() }
全域性生效的中介軟體
客戶端發起的任何請求,到達伺服器之後,都會觸發的中介軟體,叫做全域性生效的中介軟體。
通過呼叫app.use(中介軟體函式)
,即可定義一個全域性生效的中介軟體,示例程式碼如下:
// 常 mw 所指向的,就是一箇中間件函式
const mw = function(req,res,next){
console.lgo('這是最簡單的中介軟體函式')
next()
}
// 全域性生效的中介軟體
app.use(mw)
定義全域性中介軟體的簡化形式
// 全域性生效的中介軟體 app.use(function(req,res,next){ console.log('這是一個最簡單的中介軟體函式') next() })
中介軟體的作用
多箇中間件之間,共享一份req和res。基於這樣的特性,我們可以在上游的中介軟體中,統一為req或res物件新增自定義的屬性和方法,供下游的中介軟體或路由進行使用。
定義多箇中間件
可以使用app.use()連續定義多個全域性中介軟體。客戶端請求到達伺服器之後,會按照中介軟體定義的先後順序依次進行呼叫。
區域性生效的中介軟體
不使用app.use()定義的中介軟體,叫做區域性生效的中介軟體,示例程式碼如下:
// 定義中介軟體函式 mw1 const mw1 = function(req,res,next){ console.log('這是中介軟體函式') next() } // mw1 這個中間路由只在“當前路由中生效”,這種用法屬於“區域性生效的中介軟體” app.get('/',mw1,function(req,res){ res.send('Home page.') }) // mw1 這個中介軟體不會影響下面這個路由 app.get('/user',function(req,res){res.send('User page')})
定義多個區域性中介軟體
可以在路由中,通過如下兩種等價方式,使用多個區域性中介軟體:
// 以下兩種寫法是“完全等價”的,可以根據自己的喜好,選擇任意一種方式進行使用
app.get('/',mw1,mw2,(req,res)=>{ res.send('Home page') })
app.get('/',[mw1,mw2],(req,res)=>{res.send('Home.page')})
瞭解中介軟體的五個使用注意事項
-
一定要在路由之前註冊中介軟體
-
客戶端傳送過來的請求,可以連續呼叫多箇中間件進行處理
-
執行完中介軟體的業務程式碼之後,不要忘記呼叫next()函式
-
為了防止程式碼邏輯混亂,呼叫完next()函式後不要再寫額外程式碼
-
連續呼叫多箇中間件時,多箇中間件之間,共享req和res物件
中介軟體的分類
為了方便理解和記憶中介軟體的使用,Express官方把常見的中介軟體用法,分成了5大類,分別是:
-
應用級別的中介軟體
-
路由級別的中介軟體
-
錯誤級別的中介軟體
-
Express 內建的中介軟體
-
第三方的中介軟體
應用級別的中介軟體
通過 app.use()
或app.get()
或app.post()
,繫結到app例項上的中介軟體,叫做應用級別的中介軟體,程式碼示例如下:
// 應用級別的中介軟體(全域性中介軟體)
app.use((req,res)=>{
next()
})
// 應用級別的中介軟體(區域性中介軟體)
app.get('/',mw1,(req,res)=>{
res.send('Home page.')
})
路由級別的中介軟體
繫結到 express.Router()
例項上的中介軟體,叫做路由級別的中介軟體。它的用法和應用級別中介軟體沒有任何區別。只不過,應用級別中介軟體時繫結到app例項上,路由級別中介軟體繫結到router例項上,程式碼示例如下:
var app = express()
var router = express.Router()
// 路由級別的中介軟體
router.use(function(req,res,next){
console.log('Time',Date.now())
next()
})
app.use('/',router)
錯誤級別中介軟體
錯誤級別中介軟體的作用:專門用來捕獲整個專案中發生的異常錯誤,從而防止專案異常崩潰的問題。
格式:錯誤級別中介軟體的function處理函式中,必須有四個形參,形參從前到後,分別是(err,req,res,next)。
app.get('/',function(req,res){ // 路由
throw new Error('伺服器內部發生了錯誤!')
res.send('Home Page.')
})
app.use(function(err,req,res,next){
console.log('發生了錯誤'+err.message) // 錯誤級別的中介軟體
console.log('發生了錯誤:'+err.message) // 在伺服器列印錯誤訊息
res.send('Error! '+ err.message) // 向客戶端響應錯誤相關的內容
})