Eggjs是一个基于Koajs的框架,所以它是框架之上的框架,它继承了Koa的高性能优点,同时又加入了一些约束与开发规范,来规避Koajs框架本身的开发自由度太高的问题。
Egg奉行约定大于配置
npm i egg-init -g
npm init egg --type=simple
npm i
egg的设计完全符合比较好的mvc的设计模式
控制器(Controller)
'use strict'
const Controller=require('egg').Controller;
class HomeController extends Controller{
async index(){
const {ctx,service}=this
let res=await service.home.index()
ctx.body=res
}
}
module.exports=HomeController
服务(Service)
'use strict'
const Service=require('egg').Service;
class HomeService extends Service{
async index(){
return {ok:200}
}
}
module.exports=HomeService
模型(Model)
路由(Router)
module.exports=app=>{
const {router,controller}=app;
router.get('/',controller.home.index)
}
中间件
配置
约定中间件放在app/middleware目录下,需要exports一个普通的function,接收两个参数
// 错误处理中间件
module.exports=(options,app)=>{
return async function(ctx,next){
try{
await next();
}catch(err){
//所有异常都在app上触发一个error事件,框架会记录一条错误日志
app.emit('error',err,this)
const status=err.status||500
const error=''
ctx.body={
code:status,
error:error
}
}
}
}
使用
中间件编写完后需要手动挂载,再config.default.js中加入
config.middleware=[‘errorHandler’]
插件
中间件加载有先后顺序,但是中间件自身无法管理这种顺序,只能交给使用者,一旦顺序不对结果就会不同;中间件的定位是拦截用户请求,并在它前后做一些事情,例如:鉴权、安全检查、访问日志等,但实际情况是,优秀功能和请求无关,如:定时任务、消息订阅、后台逻辑等;有些功能包含非常复杂的初始化逻辑,需要再应用启动的时候完成,这显然不适合放到中间件中去实现。
在 config/plugin.js 中启用
一个插件就是一个迷你的应用,和应用(app)几乎一样:
框架扩展
框架会把 app/extend/helper.js 中定义的对象与内置 helper的prototype对象进行合并,在处理请求时会基于扩展后的prototype生成helper对象
定时任务
框架提供了一套机制来让定时任务的编写和维护更加优雅。
所有定时任务都统一存放在app/schedule目录下,每一个文件都是一个独立的定时任务,可以配置定时任务的属性和要执行的方法。