摘要:好吧且不說抽象統(tǒng)一處理的事,解決問題才是目的。確實把整個錯誤處理可以完整的抽象出來。當(dāng)然可以在中注入更多統(tǒng)一處理函數(shù),也可以通過函數(shù)名做一些判斷,比如對所有名字中包含的函數(shù)進行多帶帶的日志處理。
起因
在之前的項目中我發(fā)現(xiàn)每個控制器大約都是這樣寫的
async function findId (id) { let res; try{ res = await document.findById(id); }catch(e){ return false; } }
當(dāng)然這么寫其實沒有任何問題,甚至是一個很好的習(xí)慣,他保證了錯誤可以被正常的捕獲,另外可以在catch里隨便做處理,比如console,錯誤日志。一切都看起來那么完美
轉(zhuǎn)折那么假設(shè)現(xiàn)在有一個開發(fā)就是那么剛,寫了幾十個控制器,然后都沒加try catch,理直氣壯的說,這么多重復(fù)代碼真的不能抽象一下統(tǒng)一處理嗎。
好吧且不說抽象統(tǒng)一處理的事,解決問題才是目的。
解決吧,他剛我也剛,每個控制器加上不就是了。。。呵呵噠,邊罵邊加,我想半天也差不多了。
這樣真的好嗎,萬一現(xiàn)在在catch這需要根據(jù)e做一些特殊處理呢或者增加一個功能呢?egg的話有一個統(tǒng)一的errorhandle可以配置。確實把整個錯誤處理可以完整的抽象出來。
這里的話要提一個java大大朋友告訴我的spring的解決手段,面向切面編程,具體概念網(wǎng)上解釋很多,大約可以理解為,在所有控制器前,或者說控制器和服務(wù)之間,這樣的話就可以實現(xiàn)很多公共邏輯的抽象。
面向切面編程適合做的事,這個spring的實踐實在太多我就不贅述了,錯誤異常處理,日志,權(quán)限,這些在切面上的實踐都是很好的。
其實中間件我認為也屬于一個切面,這個切面是在請求上下文中的,但是這個切面無法覆蓋所有的要求,特別當(dāng)你需要控制的功能不是以請求為粒度控制的時候,或者說僅僅需要對服務(wù)層的服務(wù)添加功能的時候。
實踐這里就以開頭的那段代碼的簡化為例。首先是一個包裝函數(shù),用來包裝所有的控制器的方法
function controllerWrap(controllerFn, self) { return async function() { let that = self; try { await controllerFn.apply(that, arguments); } catch(e) { throw(e); } }; }
其實注意點也就兩個,注意上下文,然后是保證controllerFn的arguments不要丟了,其實也就是ctx和next的
在把所有的控制器實例化后(一般在都會把控制器形成單例模式,之后只要遍歷這些單例中的方法包裹控制器函數(shù)就可以了)。當(dāng)然可以在wrap中注入更多統(tǒng)一處理函數(shù),也可以通過函數(shù)名做一些判斷,比如對所有名字中包含save的函數(shù)進行多帶帶的日志處理。
egg在實踐上是不太一致,因為控制器并非簡單的實例化,如果需要對egg的控制器的進行包裝則需要在loader中進行包裝。
參考:https://eggjs.org/zh-cn/advan...
之后會嘗試根據(jù)現(xiàn)有的業(yè)務(wù)沉淀出一套egg之上的框架。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93886.html
摘要:日志規(guī)范一般前端開發(fā)同學(xué),對日志其實不太敏感,畢竟前端大多數(shù)情況下,不太關(guān)心日志。本文主要梳理了目前我們團隊在開發(fā)中日志方面存在的問題,以及通過統(tǒng)一日志規(guī)范,希望達到什么樣的效果。日志格式字段日志格式統(tǒng)一采用,便于解析處理。nodejs 日志規(guī)范 一般前端開發(fā)同學(xué),對日志其實不太敏感,畢竟前端大多數(shù)情況下,不太關(guān)心日志。即使有,也可能調(diào)用一些第三方的統(tǒng)計,比如百度統(tǒng)計或者別的等。在 Node...
摘要:模塊服務(wù)器服務(wù)器指網(wǎng)站服務(wù)器,指駐留在因特網(wǎng)上的某種程序,瀏覽器的基本功能,提供信息瀏覽服務(wù)支持服務(wù)器端的腳本語言,通過腳本語言從數(shù)據(jù)庫獲取數(shù)據(jù),將結(jié)果返回給客戶端瀏覽器應(yīng)用基本架構(gòu)即客戶端,通過協(xié)議向服務(wù)器發(fā)起請求服務(wù)器端,指服務(wù)器,接收 node web模塊 web服務(wù)器 web服務(wù)器指網(wǎng)站服務(wù)器,指駐留在因特網(wǎng)上的某種程序,web瀏覽器的基本功能,提供信息瀏覽服務(wù)web支持服務(wù)器...
摘要:異步編程解決方案筆記最近讀了樸靈老師的深入淺出中異步編程一章,并參考了一些有趣的文章。另外回調(diào)函數(shù)中的也失去了意義,這會使我們的程序必須依賴于副作用。 JavaScript 異步編程解決方案筆記 最近讀了樸靈老師的《深入淺出NodeJS》中《異步編程》一章,并參考了一些有趣的文章。在此做個筆記,記錄并鞏固學(xué)到的知識。 JavaScript異步編程的兩個核心難點 異步I/O、事件驅(qū)動使得...
摘要:支持請求響應(yīng)攔截器。定位與目標(biāo)的定位是成為請求的終極解決方案。攔截器支持請求響應(yīng)攔截器,可以通過它在請求發(fā)起之前和收到響應(yīng)數(shù)據(jù)之后做一些預(yù)處理。 Fly.js 是一個功能強大的輕量級的javascript http請求庫,同時支持瀏覽器和node環(huán)境,通過適配器,它可以運行在任何具有網(wǎng)絡(luò)能力的javascript運行環(huán)境;同時fly.js有一些高級的玩法如全局ajax攔截、在web a...
摘要:我所在的美團酒店事業(yè)部去年月份成立,新的業(yè)務(wù)新的開發(fā)團隊,這一切使得我們的前后端分離推進的很徹底。日志監(jiān)控平臺日志監(jiān)控平臺是美團內(nèi)部的一個日志收集系統(tǒng),目前美團統(tǒng)一使用收集日志,具有接收格式日志的能力,而日志監(jiān)控平臺也是以格式日志來收集。 轉(zhuǎn)自:美團技術(shù)團隊 作者:美團技術(shù)團隊 分享理由:很好的分享,可見,基于Node的前后端分離的架構(gòu)是越顯流行和重要,前端攻城獅們,No...
閱讀 816·2021-10-13 09:39
閱讀 3696·2021-10-12 10:12
閱讀 1740·2021-08-13 15:07
閱讀 1005·2019-08-29 15:31
閱讀 2882·2019-08-26 13:25
閱讀 1776·2019-08-23 18:38
閱讀 1878·2019-08-23 18:25
閱讀 1857·2019-08-23 17:20