资讯专栏INFORMATION COLUMN

node端统一错误处理

kaka / 1549人阅读

摘要:好吧且不说抽象统一处理的事,解决问题才是目的。确实把整个错误处理可以完整的抽象出来。当然可以在中注入更多统一处理函数,也可以通过函数名做一些判断,比如对所有名字中包含的函数进行多带带的日志处理。

起因

在之前的项目中我发现每个控制器大约都是这样写的

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://www.ucloud.cn/yun/93886.html

相关文章

  • Node.js + ELK 日志规范

    摘要:日志规范一般前端开发同学,对日志其实不太敏感,毕竟前端大多数情况下,不太关心日志。本文主要梳理了目前我们团队在开发中日志方面存在的问题,以及通过统一日志规范,希望达到什么样的效果。日志格式字段日志格式统一采用,便于解析处理。nodejs 日志规范 一般前端开发同学,对日志其实不太敏感,毕竟前端大多数情况下,不太关心日志。即使有,也可能调用一些第三方的统计,比如百度统计或者别的等。在 Node...

    tuomao 评论0 收藏0
  • node web模块 (服务器和客户)

    摘要:模块服务器服务器指网站服务器,指驻留在因特网上的某种程序,浏览器的基本功能,提供信息浏览服务支持服务器端的脚本语言,通过脚本语言从数据库获取数据,将结果返回给客户端浏览器应用基本架构即客户端,通过协议向服务器发起请求服务器端,指服务器,接收 node web模块 web服务器 web服务器指网站服务器,指驻留在因特网上的某种程序,web浏览器的基本功能,提供信息浏览服务web支持服务器...

    MonoLog 评论0 收藏0
  • JavaScript异步编程解决方案笔记

    摘要:异步编程解决方案笔记最近读了朴灵老师的深入浅出中异步编程一章,并参考了一些有趣的文章。另外回调函数中的也失去了意义,这会使我们的程序必须依赖于副作用。 JavaScript 异步编程解决方案笔记 最近读了朴灵老师的《深入浅出NodeJS》中《异步编程》一章,并参考了一些有趣的文章。在此做个笔记,记录并巩固学到的知识。 JavaScript异步编程的两个核心难点 异步I/O、事件驱动使得...

    dmlllll 评论0 收藏0
  • JS HTTP 请求终极解决方案 - fly.js

    摘要:支持请求响应拦截器。定位与目标的定位是成为请求的终极解决方案。拦截器支持请求响应拦截器,可以通过它在请求发起之前和收到响应数据之后做一些预处理。 Fly.js 是一个功能强大的轻量级的javascript http请求库,同时支持浏览器和node环境,通过适配器,它可以运行在任何具有网络能力的javascript运行环境;同时fly.js有一些高级的玩法如全局ajax拦截、在web a...

    OpenDigg 评论0 收藏0
  • [ 好文分享 ] 美团酒店Node全栈开发实践

    摘要:我所在的美团酒店事业部去年月份成立,新的业务新的开发团队,这一切使得我们的前后端分离推进的很彻底。日志监控平台日志监控平台是美团内部的一个日志收集系统,目前美团统一使用收集日志,具有接收格式日志的能力,而日志监控平台也是以格式日志来收集。 转自:美团技术团队 作者:美团技术团队 分享理由:很好的分享,可见,基于Node的前后端分离的架构是越显流行和重要,前端攻城狮们,No...

    wangdai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<