1.参数传递
参数传递有几种方式:
- 1.路径中传参 使用:id 这种方式
- 2.路径后面跟 使用get请求
- 3.header中传参
- 4.body中传参


获取路径中、路径后面或者header的参数如上图都是好获取的,但是要获取body中的参数需要一个中间件才行:

使用:

2.异常理论
异常我们一般是通过try catch来捕获处理,下面有个图我们看下:

如上图,按照一般的逻辑,程序最后是会打印出error,因为func2会捕获到func3,但是真实的运行下来发现并没有打印error,而是直接报了一个异常。
这就是异步编程的异常难以处理的原因,因为异步,所在在func3执行定时器的时候,因为等待,所以直接下一步返回信息到了func2,然后func2并没有发现异常,然后就没有进入到catch里面。
在有关于异常冒泡的情况,上下都加上async和await即可。
但是,注意但是:一定要对调用方加上这两个关键字,返回方要返回promise
如果如下图这样,那么最终还是达不到理性的结果

如果在func3的方法最后加上return 1;那么return 1还是会返回出去。
我们需要对setTimeout里面的异步函数function加上关键字。

难道异步调用的异常处理这么难搞吗
如上面所述我们每次都需要包装一下,返回一个promise那不是累死了吗,这点还好,因为KOA包提供的各种函数基本返回的都是promise。
如果调用函数没有加await的话,就会报这样的错-没有处理的异常。

3.全局异常处理-中间件编写
编写测试的代码:

中间件的代码:


4.定义异常返回格式


上面定义没有问题,但是还可以优化,我们创建一个异常的基类,然后以对象的形式创建异常就更快了。
异常基类:

然后我们引入这个中间件即可使用:


5.特定异常类与global全局变量
在上面我们定义了一个异常类,然后方便我们统一的捕获异常并返回,但是有个小问题就是我们每次都要去构造一个异常类,这样有点麻烦,对于此我们可以多封装几个常用的异常类,这样如果遇到异常直接返回相应的异常即可:


那么还有优化空间吗?有:
我们每次要抛出异常的时候都得先引入异常的中间件,然后返回,是否可以有种方式,不用再引包?
我们可以在项目初始化的时间,封装一个全局变量,把异常赋值给他即可:


这样使用就行:

处理了已知的异常,剩下我们可以处理一下未知的异常:

网友评论