node端一致错误处理

原由

在之前的项目中我发明每一个掌握器约莫都是如许写的

async function findId (id) {
    let res;
    try{
        res = await document.findById(id);
    }catch(e){
        return false;
    }
}

固然这么写着实没有任何问题,以至是一个很好的习气,他保证了毛病能够被平常的捕捉,别的能够在catch里随意做处置惩罚,比方console,毛病日记。一切都看起来那末圆满

转机

那末假定如今有一个开辟就是那末刚,写了几十个掌握器,然后都没加try catch,义正词严的说,这么多反复代码真的不能笼一致下一致处置惩罚吗。
好吧且不说笼统一致处置惩罚的事,处理问题才是目标。
处理吧,他刚我也刚,每一个掌握器加上不就是了。。。呵呵哒,边骂边加,我想半天也差不多了。
如许真的好吗,万一如今在catch这须要依据e做一些迥殊处置惩罚呢或许增添一个功用呢?egg的话有一个一致的errorhandle能够设置。确切把全部毛病处置惩罚能够完全的笼统出来。

面向切面编程

这里的话要提一个java大大朋侪告诉我的spring的处理手腕,面向切面编程,详细观点网上诠释许多,约莫能够理解为,在一切掌握器前,或许说掌握器和效劳之间,如许的话就能够完成许多大众逻辑的笼统。
面向切面编程合适做的事,这个spring的实践着实太多我就不赘述了,毛病非常处置惩罚,日记,权限,这些在切面上的实践都是很好的。

切面与中间件

着实中间件我以为也属于一个切面,这个切面是在请求高低文中的,然则这个切面没法掩盖一切的请求,迥殊当你须要掌握的功用不是以请求为粒度掌握的时刻,或许说仅仅须要对效劳层的效劳增加功用的时刻。

实践

这里就以开首的那段代码的简化为例。首先是一个包装函数,用来包装一切的掌握器的要领

    function controllerWrap(controllerFn, self) {
        return async function() {
            let that = self;
            try {
                await controllerFn.apply(that, arguments);
            } catch(e) {
                throw(e);
            }
        };
    }

着实注重点也就两个,注重高低文,然后是保证controllerFn的arguments不要丢了,着实也就是ctx和next的
在把一切的掌握器实例化后(平常在都会把掌握器形成单例形式,以后只需遍历这些单例中的要领包裹掌握器函数就能够了)。固然能够在wrap中注入更多一致处置惩罚函数,也能够经由过程函数名做一些推断,比方对一切名字中包括save的函数举行零丁的日记处置惩罚。

egg.js的实践

egg在实践上是不太一致,由于掌握器并不是简朴的实例化,假如须要对egg的掌握器的举行包装则须要在loader中举行包装。
参考:https://eggjs.org/zh-cn/advan…
以后会尝试依据现有的营业沉淀出一套egg之上的框架。

    原文作者:求实亭下
    原文地址: https://segmentfault.com/a/1190000014118158
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞