当前位置: 首页 > 工具软件 > Eggjs > 使用案例 >

Eggjs

凤修为
2023-12-01

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,接收两个参数

  1. options:中间件的配置项,框架会将app.config[${middlewareName}]传递进来
  2. app:当前应用Application的实例
// 错误处理中间件
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)几乎一样:

  • 包含Service、中间件、配置、框架扩展
  • 没有独立的Router和Controller
  • 没有 plugin.js ,只能声明跟其他插件的依赖,而不能决定其他插件的开启与否

框架扩展
框架会把 app/extend/helper.js 中定义的对象与内置 helper的prototype对象进行合并,在处理请求时会基于扩展后的prototype生成helper对象

定时任务
框架提供了一套机制来让定时任务的编写和维护更加优雅。
所有定时任务都统一存放在app/schedule目录下,每一个文件都是一个独立的定时任务,可以配置定时任务的属性和要执行的方法。

相关阅读

相关文章

相关问答