全局异常处理

优质
小牛编辑
138浏览
2023-12-01

统一错误处理

文档:https://eggjs.org/zh-cn/tutorials/restful.html


自定义一个异常基类

// app / exceptions / http_exceptions.js
class HttpExceptions extends Error {
 constructor(msg='服务器异常', code=1, httpCode=400) {
     super()
     this.code = code;
     this.msg = msg;
     this.httpCode = httpCode;
 }
}
module.exports = { HttpExceptions };

2. 定义全局异常处理中间件

// app / middleware / error_handler.js
const { HttpExceptions } = require('../exceptions/http_exceptions');
module.exports = () => {
  return async function errorHandler(ctx, next) {
    try {
      await next();
    } catch (err) {
      // 所有的异常都在 app 上触发一个 error 事件,框架会记录一条错误日志
      ctx.app.emit('error', err, ctx);

      let status = err.status || 500;
      let error = {};

      if (err instanceof HttpExceptions) {
        status = err.httpCode
        error.requestUrl = `${ctx.method} : ${ctx.path}`;
        error.msg = err.msg;
        error.code = err.code;
        error.httpCode = err.httpCode;
      } else {
        // 未知异常,系统异常,线上不显示堆栈信息
        // 生产环境时 500 错误的详细错误内容不返回给客户端,因为可能包含敏感信息
        error.errsInfo = status === 500 && ctx.app.config.env === 'prod'
        ? 'Internal Server Error'
        : err.message;
      }
      // 从 error 对象上读出各个属性,设置到响应中
      ctx.body = error;
      if (status === 422) {
        ctx.body.detail = err.errors;
      }
      ctx.status = status;
    }
  };
};