(一)egg-基础功能
快速上手
npm install egg --type = simple
可选的骨架类型
simple - 简单的egg应用程序骨架
empty - 空的egg应用程序骨架
plugin - egg plugin骨架
Framework - egg framework骨架
目录结构
`app/router.js` 用于配置 URL 路由规则
`app/controller/**` 用于解析用户的输入,处理后返回相应的结果
`app/service/**` 用于编写业务逻辑层
`app/middleware/**` 用于编写中间件
`app/public/**` 用于放置静态资源
`app/extend/**` 用于框架的扩展
`config/config.{env}.js` 用于编写配置文件
`config/plugin.js` 用于配置需要加载的插件
`test/**` 用于单元测试
`app.js 和 agent.js` 用于自定义启动时的初始化工作
`app/schedule/**` 用于定时任务
`app/view/**` 用于放置模板文件
`app/model/**` 用于放置领域模型
内置对象
(1)Application
全局应用对象,可以将一些全局的方法和对象挂载到上面,
事件
application包含的事件有
- server 在http服务完成启动之后,将HTTP server通过该事件暴露出来。
- error 异常事件
- request 收到请求触发
- response 响应请求触发
一般需要在应用启动期间进行一些初始化工作,初始化完成之后才可对外提供服务,egg框架提供了统一的入口文件-app.js进行启动过程的自定义,app.js返回一个boot类,可以在该类的声明周期方法中执行启动应用的初始化工作。
包含的声明周期方法有:
生命周期方法 | 说明 |
---|---|
configDidLoad | 配置文件加载完成 |
configWillLoad | 配置文件即将加载,修改配置文件的最终时机 |
didLoad | 文件加载完成 |
willReady | 插件启动完毕 |
didReady | worker准备就绪 |
serverDidReady | 应用启动完成 |
beforeClose | 应用即将关闭 |
Application对象的获取方式
- 作为参数
- 在context对象上,通过ctx.app
- 在继承于controller和service基类的实例中,可以通过this.app访问到
(2)Context
context是请求级别的对象,收到的用户请求会实例化一个context对象,该对象封装了用户的请求信息,框架将所有的Service挂载在context实例上。
获取方式
- 在controller中获取 this.ctx
- 在sevice中获取 this.ctx
- middleware中,this或ctx
- 在非用户请求情况下需要访问service/model等context实例上的对象
// app.js
module.exports = app => {
app.beforeStart(async () => {
const ctx = app.createAnonymousContext();
// preload before app start
await ctx.service.posts.load();
});
}
- 定时任务,使用ctx作为参数
(3)response & request
获取方式
- ctx.request
- ctx.response
获取post的body内容应该使用ctx.request.body
(4)Controller
egg框架提供了controller基类,并推荐所有的controller均继承该基类实现。
其包含如下属性:
- ctx :当前请求的context实例
- app:application实例
- config:应用的配置
- service:应用的所有service
- logger:日志对象
(5)service & helper & Config & logger
-
sevice:内置service基类,并推荐所有service继承此基类 属性同controller
-
helper:提供一些实用的utility函数,可以通过ctx.helper获取请求的helper实例
可以通过框架扩展的形式自定义helper的方法。 -
config:通过app.config获取到config对象,也可以在controller sevice helper上通过this.config获取
-
logger: 包含以下几种方法
logger.debug(); logger.info(); logger.warn(); logger.error();
中间件
中间件的编写
(1)写法
// app/middleware/gzip.js
const isJSON =