Egg优雅的实现异常处理

5,460 阅读2分钟

目录

后面会继续更新几篇,具体目录如下

  1. Egg优雅的实现异常处理
  2. Egg实现JWT鉴权

前言

这些文章就是记录点的东西,当笔记的,尽量简短实用;今天简单写一下假设eggjs开发一个api接口服务器,并根据各种情况正确返回json格式,优雅的实现异常处理;

为什么需要错误处理

  1. 防止程序挂掉
  2. 告诉用户错误信息
  3. 方便开发调试,定位问题
  4. api接口服务器规定的返回数据结构

几种错误

  1. 程序运行错误 如500错误
  2. 开发自己抛出的异常错误
  3. 404错误

自己实现中间件

我们先自己实现一个中间件来处理错误,下一个话题说如何避免造轮子

egg demo的结构示意图
这里我自己创建middleware目录,用于存储中间件

module.exports = options => {
  return async(ctx, next) => {
    try {
      await next();
    } catch (err) {
    // 我们就简单的try catch处理一下异常,同实因为上述提到的第一种程序运行错误无status和statusCode,因为这里有500处理
      ctx.status = err.status || err.statusCode || 500;
      ctx.body = {
        message: err.message,
      }
    }
  }
}

上述就是一个简单的自定义错误中间件处理,通过这个中间件我们可以实现类似下图的错误处理(这里我们在controller中通过koa自带ctx.throw方法抛出403错误)

postman中403测试结果

但这个中间件有个小问题,在404时候的处理并不友好,并没有满足要求返回json

404返回结果

避免重复造轮子

egg基于koa,这里我们没必要重复造轮子,可以使用社区一个优秀的轮子koa-json-err;感兴趣可以点击链接去github阅读更多

egg中使用koa中间件

// middlware/error.js
module.exports = require('koa-json-error');
// config/config.xxx.js中可以配置
config.middleware = ['error'];
config.error = {
    // 这里使用appInfo.env来判断环境,仅仅在非生产环境下打开堆栈信息,用于调试
    postFormat: (e, { stack, ...rest}) => appInfo.env === 'prod' ? rest: { stack, ...rest}
}

使用中间后的404处理

总结

综上就是简单介绍了一下egg中优雅处理各种异常的方式了;下一篇将简单记录下如何实现jwt认证