egg框架提供了多种扩展点扩展自身的功能:
- Applictaion
- Context
- Request
- Response
- Helper
Application
app 对象指的是 Koa 的全局应用对象,全局只有一个,在启动时被创建。
访问方式
- ctx.app
- Controller, MiddleWare, Helper, Service中都可以通过 this.app 访问到 Application 对象。
- 在 app.js 中 app 对象会作为第一个参数注入到入口函数中
1 | // app.js |
扩展方式
框架会把 app/extend/application.js 中定义的对象与 Koa Application 的 prototype 对象进行合并,在应用启动时会基于扩展后的 prototype生成 app 对象。可通过方法扩展和属性扩展。
一般来说属性的计算只需要进行一次,那么一定要实现缓存,否则在多次访问属性时会计算多次,这样会降低应用性能。
推荐的方式是使用 Symbol + Getter 的模式
1 | // app/extend/application.js |
Context
Context 指的是 Koa 的请求上下文,这是 请求级别 的对象,每次请求生成一个 Context 实例,通常我们也简写成 ctx。在所有的文档中,Context 和 ctx 都是指 Koa 的上下文对象。
访问方式:
- middleware 中的 this 就是 ctx 。例: this.cookies.get(‘foo’)。
- controller 中有两种写法:类的写法通过 this.ctx,方法的写法直接通过 ctx 入参。
- helper, service 中的 this 指向 helper, service 本身,使用 this.ctx 访问 context 对象。
### 扩展方式
框架会把 app/extend/context.js 中定义的对象与 Koa Context 的 prototype 对象进行合并,在处理请求时会基于扩展后的 prototype 生成 ctx 对象。可通过方法扩展和属性扩展。
一般来说属性的计算在同一次请求中只需要进行一次,那么一定要实现缓存,否则在同一次请求中多次访问属性时会计算多次,这样会降低应用性能。
推荐的方式是使用 Symbol + Getter 的模式。
1 | // app/extend/context.js |
Request
Request 对象和 Koa 的 Request 对象相同,是 请求级别 的对象,它提供了大量请求相关的属性和方法供使用。
访问方式
1 | ctx.request |
ctx 上很多属性和方法都代理到 request 对象上,对于这些属性和方法使用 ctx 和 使用 request 去访问是等价的。例: ctx.url === ctx.request.url.
扩展方式
框架会把 app/extend/request.js 中定义的对象与内置的 request 的 prototype 对象进行合并,在处理请求时会基于扩展后的 prototype 生成 request 对象。
例如增加一个 request.foo 属性 getter:
1 | // app/extend/request.js |
Response
Response 对象和 Koa 的 Response 对象相同,是 请求级别 的对象,它提供了大量响应相关的属性和方法供使用。
访问方式
1 | ctx.response |
ctx 上的很多属性和方法都被代理到 response 对象上,对于这些属性和方法使用 ctx 和使用 response 去访问它们是等价的,例如 ctx.status = 404 和 ctx.response.status = 404 是等价的。
扩展方式
框架会把 app/extend/response.js 中定义的对象与内置 response 的 prototype 对象进行合并,在处理请求时会基于扩展后的 prototype 生成 response 对象。
例如:增加一个 response.foo 属性 setter:
1 | // app/extend/response.js |
可以这样使用了:this.response.foo = ‘bar’;
Helper
Helper 函数用来提供一些实用的 utility 函数。
它的作用在于我们可以将一些常用的动作抽离在 helper.js 里面成为一个独立的函数,这样可以用 JavaScript 来写复杂的逻辑,避免逻辑分散各处。另外还有一个好处是 Helper 这样一个简单的函数,可以让我们更容易编写测试用例。
访问方式
通过 ctx.helper 访问 Helper 对象。
1 | // 假设在 app/router.js 中定义了 home router |
扩展方式
框架会把 app/extend/helper.js 定义的对象与内置的 helper 的prototype 对象合并,在处理请求时会基于扩展后的 prototype 生成 helper 对象。
1 | // app/extend/helper.js |