全局异常处理
优质
小牛编辑
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; } }; };