原因在之前的项目中,我发现每个controller大致都是这样写的asyncfunctionfindId(id){letres;试试{res=awaitdocument.findById(id);}catch(e){返回错误;}}当然这样写也没什么不好,甚至是个好习惯。它保证了错误可以被正常捕获,你可以在捕获中做任何你想做的事情,比如控制台和错误日志。一切看起来都是那么完美,那么假设有一个开发那么新,写了几十个控制器,然后没有添加trycatch。按理说,这么多重复的代码,是无法统一抽象处理的。好了,不说抽象统一处理,解决问题才是目的。解决吧,他刚做我也刚做,给每个controller加就行了。..嘿嘿嘿,一边骂一边加,我看也快半天了。这真的好吗?如果你现在需要做一些特殊的处理或者在catch中添加一个函数怎么办?对于egg,有统一的errorhandle可以配置。实际上,整个错误处理可以完全抽象。对于面向方面的编程,我想提一个java大朋友告诉我的spring解决方案。面向方面的编程在Internet上有许多特定的概念解释。可以粗略的理解为,在所有controller的前面,或者controllers和service之间。如果是这样,就可以实现很多通用逻辑的抽象。适用于面向切面编程的spring实践有很多,我就不赘述了。错误和异常处理、日志记录、权限,这些方面的练习都很好。切面和中间件其实我觉得中间件也是属于切面的。这个方面是在请求上下文中,但是这个方面并不能涵盖所有的需求,尤其是当你需要控制的功能在请求的粒度上没有得到控制,或者只有当你需要在服务层的服务中增加功能时。练习这里以开头的代码精简为例。第一个是包装函数,用于包装所有控制器方法functioncontrollerWrap(controllerFn,self){returnasyncfunction(){try{awaitcontrollerFn.apply(that,arguments);}抓住(e){抛出(e);}};}其实只需要注意两点,注意上下文,然后保证controllerFn的参数不丢失。其实就是所有controller实例化之后的ctx和next(一般现在controller会形成单例模式,然后只需要遍历这些单例中的方法,将controller函数包装起来)。当然可以在wrap中注入更多统一的处理函数,也可以通过函数名做一些判断,比如对所有函数名包含save的函数单独进行日志处理。egg.js的做法在实践中并不是很一致,因为controller并不是简单的实例化。如果需要包裹eggcontroller,需要在loader中包裹。参考:https://eggjs.org/zh-cn/advan...之后会尝试在现有业务的基础上开发一个框架。
