Skip to content

Latest commit

 

History

History
168 lines (138 loc) · 4.81 KB

README.zh-CN.md

File metadata and controls

168 lines (138 loc) · 4.81 KB

egg-bizerror

NPM version build status Test coverage David deps Known Vulnerabilities npm download

egg 业务异常处理插件.

安装

$ npm i egg-bizerror --save

使用

// config/plugin.js
exports.bizerror = {
  enable: true,
  package: 'egg-bizerror',
};

配置

// config/config.default.js
exports.bizerror = {
  breakDefault: false, // 全局关闭默认处理逻辑
  sendClientAllParams: false, // 输出所有的 bizParams 至浏览器,将挂载在 json 对象的 errors 属性上。
  interceptAllError: false, // 拦截所有的异常,默认是只拦截有 error.bizError=true 标记的异常
};

// config/errorcode.js
module.exports = {
  'USER_NOT_EXIST': {
    status: 400,
    code: '400' // 重写返回的 code 值
    message: 'can`t find user info',
    errorPageUrl: '', // 当请求头 Accept 是 html 时,将302跳转至该链接 
    addtion1: 'a', // 多余配置信息,将附加在结果中输出给浏览器
  },
  'NOT_FOUND': {
    errorPageUrl: (ctx, error) => {
      return '/404.html';
    }
  }
  '404': (ctx, error) => {
    ctx.redirect('/404.html');
    return false; // return false, 将阻断默认处理逻辑
  }
}

API

  • ctx.throwBizError(code, error, bizParams)

    throw an biz error

    • code - error.code, 默认 SYSTEM_EXCEPTION,将根据该值,在errorcode.js文件中寻找对应配置。
    • error - Error 对象或者message
    • bizParams - error.bizParams, 扩展数据,存放方便帮你定位异常原因的数据,会记录在错误日志中。可以选择开启sendClientAllParams,全部返回给客户端请求。
    • bizParams.sendClient - 发送给客户端的数据,将挂载到json对象的errors属性上。
    • bizParams.code - 覆盖error.code.
    • bizParams.log - error.log, 是否记录该错误至日志.
// throw an error object
// error.code
// error.message
// error.log
// error.bizParams
// error.bizError
ctx.throwBizError('system_exception')
ctx.throwBizError(new Error())
ctx.throwBizError({ code: 'system_exception', log: false })
ctx.throwBizError('system_exception', { userId: 1, log: false })
ctx.throwBizError('system_exception', 'error message')
ctx.throwBizError('system_exception', new Error())
ctx.throwBizError(new Error(), { userId: 1, log: false })
ctx.throwBizError('system_exception', 'error message', { userId: 1, log: false })
  • ctx.responseBizError(error, bizParams)

    处理异常方法

    • bizParams - 配置同上。
    • bizParams.bizError - 当需要处理非ctx.throwBizError抛出的异常时,需要手动标记bizError: true.
  • app.on('responseBizError', (ctx, error) => {})

    你可以监听该事件,做一些其他事情,比如:统计错误等等。

  • app.BizErrorHandler

    默认的异常处理类,你可以重写该类。

范例

// app/service/user.js
module.exports = app => {
  class User extends app.Service {
    async getUserId() {
      let userInfo;
      try {
        userInfo = await this.getUser();
      } catch (error) {
        ctx.responseBizError(error, { bizError: true, code: 'USER_NOT_EXIST' })
        return;
      }
      
      if (!userInfo || !userInfo.id) {
        ctx.throwBizError('USER_NOT_EXIST');
      }
      return userInfo.id;
    }
  }
  return User;
};

// app.js
// 增加监听逻辑,做异常分类统计
module.exports = app => {
  app.on('responseBizError', (ctx, error) => {
    if (error.bizParams && error.bizParams.bizType === 'getUser') {
      errorCount++;
    }
  });
};

// app.js
// 如果有特殊需要,可以选择重写默认处理类
module.exports = app => {
  app.BizErrorHandler = class extends app.BizErrorHandler {
    json(ctx, error, config) {
      ctx.body = {
        code: config.code,
        msg: config.message,
      };
    }
  }
};

License

MIT