目录
后面会继续更新几篇,具体目录如下
前言
这些文章就是记录点的东西,当笔记的,尽量简短实用;今天简单写一下假设eggjs开发一个api接口服务器,并根据各种情况正确返回json格式,优雅的实现异常处理;
为什么需要错误处理
- 防止程序挂掉
- 告诉用户错误信息
- 方便开发调试,定位问题
- api接口服务器规定的返回数据结构
几种错误
- 程序运行错误 如500错误
- 开发自己抛出的异常错误
- 404错误
自己实现中间件
我们先自己实现一个中间件来处理错误,下一个话题说如何避免造轮子
这里我自己创建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错误)
但这个中间件有个小问题,在404时候的处理并不友好,并没有满足要求返回json
避免重复造轮子
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}
}
总结
综上就是简单介绍了一下egg中优雅处理各种异常的方式了;下一篇将简单记录下如何实现jwt认证