Egg框架介绍和应用(二)
上次的 Egg 分享文章中讲了 app 目录下的 service、controller、router 和 extend,这几个都是 Egg 日常开发最常在里面开发的文件目录,当然 app 目录下还可以建立 schedule 目录然后新增定时任务,不过定时任务是有需要再去了解也不迟的功能,但是接下来分享的是必须要了解的 Egg 的知识点。
# middleware
中间件无论在 express 或者 koa 都是最重要的,也是这两个库的最大区分点,Egg 作为 koa 的上层框架,肯定是继承了 koa 的洋葱圈模型。所以 Egg 也是可以像 koa 一样后置全局捕获错误的,这里我们先写一个捕获全局错误的中间件:
// app/middleware/error_handler.js
"use strict";
module.exports = (option, app) => {
return async function(ctx, next) {
try {
await next();
} catch (err) {
// 所有的异常都在 app 上触发一个 error 事件,框架会记录一条错误日志
app.emit("error", err, this);
const status = err.status || 500;
// 生产环境时 500 错误的详细错误内容不返回给客户端,因为可能包含敏感信息
const error =
status === 500 && app.config.env === "prod"
? "Internal Server Error"
: err.message;
// 从 error 对象上读出各个属性,设置到响应中
ctx.body = {
code: status, // 服务端自身的处理逻辑错误(包含框架错误500及自定义业务逻辑错误 ),客户端请求参数导致的错误,设置不同的状态码
error: error
};
// 创建或者更新对象的时候验证错误
if (status === 422) {
ctx.body.detail = err.errors;
}
// 生产环境一律返回200
ctx.status =
status === 500 && app.config.env === "prod" ? 200 : err.status;
}
};
};
然后我们在 config 目录下的 config.default.js 下添加代码:
// config/config.default.js
"use strict";
module.exports = appInfo => {
const config = (exports = {});
config.middleware = ["errorHandler"];
return {
...config
};
};
注意中间件一定要放在 app 文件夹的 middleware 文件夹下,然后直接在 config 的 middleware 数组增加中间件的文件名即可以了。
# 插件
插件是 Egg 的一大特色,具体介绍可以官网的介绍 (opens new window)。Egg 的插件大部分是由 Egg 的核心开发人员编写维护的,当然由于基于 koa 的缘故,当你在 Egg 的插件生态 (opens new window)中找不到你想要的插件时,可以去找 koa 的 npm 包,然后安装之后自己稍微封装一下就能使用了。比如我们需要要使用bcrypt插件:
首先先在项目安装包:
$ npm i egg-bcrypt --save
然后再配置文件增加:
// config/config.default.js
"use strict";
module.exports = appInfo => {
const config = (exports = {});
config.middleware = ["errorHandler"];
config.bcrypt = {
saltRounds: 10
};
return {
...config
};
};
// app/config/plugin.js
'use strict';
exports.bcrypt = {
enable: true,
package: 'egg-bcrypt'
}
插件的可选配置直接在 config 那里写上就可以了,在 Egg 里面是配置优于代码的。
# 智能提示和提示
在Egg框架中提供了智能提示和跳转的功能,如图:
详细的介绍可以看语雀的文档 (opens new window)
# 结语
Egg的介绍就先到这里,后面我会持续写关于用Egg开发的文章,包括但不限于日常开发要用到的插件、数据库的操作和部署上线。