二、express中间件
一、中間件引入
實現(xiàn)加入日志模塊功能:
1. 我們能想到的方案:
將日志輸出代碼封裝到函數(shù)中,然后需要日志輸出的地方調(diào)用這個函數(shù)即可。
app.js文件:
2. 使用中間件
二、中間件的概念
在我理解Express 中間件和AOP面向切面編程就是一個意思,就是都需要經(jīng)過經(jīng)過的一些步驟,不去修改自己的代碼,以此來擴展或者處理一些功能。
什么是AOP?中文意思是面向切面編程,聽起來感覺很模糊。先舉個生產(chǎn)的例子。
最后在流水線中的空隙插上兩個工人去處理,形成采摘-分類-清洗-包裝
-貼標簽的新流程,而且工人可以隨時撤回。
AOP(Aspect Oriented Programming)面向切面編程:
- 將日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等代碼從業(yè)務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業(yè)務邏輯的方法中,進而改變這些行為的時候不影響業(yè)務邏輯的代碼。
- 利用AOP可以對業(yè)務邏輯的各個部分進行隔離,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率和可維護性。
總結:就是在現(xiàn)有代碼程序中,在程序生命周期或者橫向流程中加入/減去一個或多個功能,不影響原有功能。
三、Express中的中間件
在Express中,中間件就是一個可以訪問請求對象、響應對象和調(diào)用next方法的一個函數(shù)。
在中間件函數(shù)中可以執(zhí)行以下任何任務:
- 執(zhí)行任何代碼
- 修改request 或者response響應對象
- 結束請求響應周期
- 調(diào)用下一個中間件
注意:如果當前的中間件功能沒有結束請求-響應周期,則必須調(diào)用next()將控制權傳遞給下一個中間件功能。否則,該請求將被掛起。
四、Express中的中間件分類
在Express中應用程序可以使用以下類型的中間件:
- 應用程序級別中間件
此示例顯示了一個中間件子堆棧,該子堆棧處理對/user/:id路徑的GET請求。
表示繼續(xù)跳轉(zhuǎn)執(zhí)行下一個middle或者route函數(shù)。
表示丟棄當前route的剩余callback函數(shù),注意只在由app.METHOD()/route.METHOD()中定義的middleware函數(shù)中生效。
對于任何非’route’參數(shù)(不管是一個簡單數(shù)字或者還是一個字符串)都被認為是一個err,跳轉(zhuǎn)到錯誤處理函數(shù)。
中間件也可以在數(shù)組中聲明為可重用。此示例顯示了一個帶有中間件子堆棧的數(shù)組,該子堆棧處理對/user/:d路徑的GET請求
- 路由級別中間件
路由器級中間件與應用程序級中間件的工作方式相同,只不過它綁定到實例express.Router()
使用router.use()和router.METHOD()函數(shù)加載路由器級中間件.
以下示例代碼通過使用路由器級中間件來復制上面顯示的用于應用程序級中間件的中間件系統(tǒng):
- 錯誤處理中間件
以與其他中間件函數(shù)相同的方式定義錯誤處理中間件函數(shù),除了使用四個參數(shù)而不是三個參數(shù)(特別是使用簽名(err,req,res,next))之外:
錯誤處理中間件始終帶有四個參數(shù)。你必須提供四個參數(shù)以將其標識為錯誤處理中間件函數(shù)。即使不需要使用該next對象,也必須指定它以維護簽名。否則,該next 對象將被解釋為常規(guī)中間件,并且將無法處理錯誤。
如果將任何內(nèi)容傳遞給該next()函數(shù)(字符串除外’route’),Express都會將當前請求視為錯誤,并且將跳過所有剩余的非錯誤處理路由和中間件函數(shù)。
中間件處理404:
-
內(nèi)置中間件
Express 具有以下內(nèi)置中間件函數(shù):
-
第三方中間件
早期的Express內(nèi)置了很多中間件.后來Express在4.x之后移除了這些內(nèi)置中間件,官方把這些功能性中間件以包的形式單獨提供出來.這樣做的目的是
為了保持Express本身極簡靈活的特性,開發(fā)人員可以根據(jù)自己的需要去靈
活的使用.
有關Express常用的第三方中間件功能的部分列表,請參閱:
https://www.expressjs.com.cn/resources/middleware.html
第三方中間件morgan的使用:
morgan用來輸出日志信息
總結
以上是生活随笔為你收集整理的二、express中间件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue移动端项目——Vant 移动端 R
- 下一篇: express项目搭建 初始化详细步骤