美文网首页
NodeJs+Koa学习4、异步异常和全局异常处理

NodeJs+Koa学习4、异步异常和全局异常处理

作者: 那钱有着落吗 | 来源:发表于2022-03-10 10:02 被阅读0次

    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全局变量

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


    那么还有优化空间吗?有:

    我们每次要抛出异常的时候都得先引入异常的中间件,然后返回,是否可以有种方式,不用再引包?

    我们可以在项目初始化的时间,封装一个全局变量,把异常赋值给他即可:

    这样使用就行:


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

    相关文章

      网友评论

          本文标题:NodeJs+Koa学习4、异步异常和全局异常处理

          本文链接:https://www.haomeiwen.com/subject/qndtdrtx.html