Node使用事件來組織應用結構及觸發事件
單一職責意味著處理http路由的類真的不應該發送電子郵件,因為這是完全不同的兩個工作,不能混在一起。控制反轉是依賴倒置的一種方式,可以移除直接的調用——不使用類似emails.sendAccountCreation的方法,你的發送電子郵件相關的類應該只響應相關的事件。
對於Node開發者來說,事件是最重要的使用工具之一。幸運的是,SOLID原則告知我們把電子郵件相關的代碼從http路由的處理代碼中移出來,改成使用抽象的事件方式來實現,來讓代碼變得更好。這些事件可以對相應的類來做出響應。
下圖展示了我們的應用結構應該是怎麼樣的。但是如何實現?例如Express應用,並沒有一個合適的全局事件對象。你可以在某個地方創建一個全局變數,就像調用express()方法的文件一樣,但是這樣會暴露一個全局可共享的狀態,這樣會破壞我們之前提及的原則。
幸運的是,Express已經在請求中有一個引用指嚮應用對象。路由的處理中,當拿到req,res參數時,可以使用res.app來獲取應用對象。這個對象繼承EventEmitter,所以當需要時可以使用它來進行事件廣播。如果你在路由處理中創建和保持了新的用戶,它可以觸發一個res.app.emit("user:created",user)或者類似的事件——你可以使用任何符合需要的命名。然後可以監聽user:created事件來根據需要進行響應處理。這裡可以包含發送電子郵件的通知,也可以做用戶相關的日誌統計。下邊的代碼會展示如何在應用對象上監聽事件:
在這個例子定義了一個註冊用戶的路由,然後定義了一個事件監聽器,綁定一個發送email的方法。這個路由可以在下邊的例子看到
上述代碼包括了一個用戶對象的數據模型例子。如果成功創建用戶了,那麼user:created事件會在應用對象上觸發。下載本書相關的源碼可以獲取發送電子郵件的完整例子,但是移除直接調用和堅持單一職責的基礎原則的方法已經在這裡展示了。
在應用中使用事件進行通信是十分有用的,特別是當你需要讓代碼對其他開發者來說更加容易理解時,或者需要多次和客戶端代碼進行數據交換時。下一個技巧將會為你展示在Node應用中如何利用WebSockets,同時也會涉及如何獲取類似session這樣的數據。
※統一處理錯誤異常來簡化web應用程序
※使用框架來創建RESTful的web服務
※Browserify用於創建一個客戶端腳本
※使用路由分離來把相關的路由拆分到各個模塊中
※Node在shell中執行命令
TAG:行家匯 |
※領域事件及事件匯流排EventBus使用實踐
※Facebook創始人為泄露用戶數據事件道歉,將杜絕類似事件發生
※蘋果回應客服竊取 iCloud 勒索用戶事件:確有此事,將與顧客一起調查
※蘋果回應客服竊取用戶 iCloud 賬號以及恐嚇事件
※Facebook將向受數據泄露事件影響用戶發通知
※員工入侵用戶iCloud並進行敲詐?蘋果:事件屬實
※蘋果回應員工入侵用戶iCloud信息事件,傳達了這兩個關鍵信息
※韓組織起訴蘋果欺詐 直指iPhone降頻事件
※iPhone維修「變磚」事件發酵 官方配件也不認
※蘋果官方回應iCloud遭入侵事件:將與用戶一起調查
※蘋果回應 MacBook Pro 電池發脹事件,並承諾為用戶免費更換電池
※Nokia手機爆炸致死事件!官方表示和他們沒關係
※分析師說,Facebook 數據泄漏事件可能會推動區塊鏈技術發展
※蘋果回應 iOS 源代碼泄露事件,不會對用戶的設備安全構成威脅
※蘋果回應V社串流APP事件:Steam Link違反應用商店規則
※蘋果又惹事了!iPhone 7信號門或真正成為轉衰的關鍵事件
※Facebook事件為互聯網公司敲響警鐘,用戶數據使用亟待立法規範
※Uber 「殺人」事件
※Facebook緊急採取措施面對信息泄漏事件!
※對話iCloud泄密事件當事人:需要蘋果給一個負責的說法