Egg.js 从 Koa 继承了四个基本对象:Application
, Context
, Request
和 Response
。
Application
全局应用对象,一个应用只实例化一个对象。
相关事件
应用运行过程中的某些特殊时刻定义了对应的事件:
"server"
:应用启动后触发,所以只会触发一次"error"
:运行时的异常被 onerror 插件捕获后触发,将错误对象和上下文对象暴露给开发者"request"
:应用收到请求后触发,回调函数在 Controller 处理请求之前被执行,暴露上下文对象"response"
:应用响应请求后触发,暴露上下文对象
上述事件可以在自定义启动脚本(app.ts)中被监听到,格式如下:
import { Application, Context } from 'egg'
import { Server } from 'http'
export default function(app: Application) {
app.once('server', (server: Server) => { /* do something */ })
app.on('error', (err: Error, ctx: Context) => { /* do something */ })
app.on('request', (ctx: Context) => { /* do something */ })
app.on('response', (ctx: Context) => { /* do something */ })
}
获取方式
- app.ts 中:
app
是默认导出函数的唯一参数 - 控制器中:
this.app
- Context 对象上:
ctx.app
Context
Context 对象是用来辅助请求处理的,每次收到请求时,应用都会实例化一个 Context 对象,这个对象包含了:
- 请求相关的信息
- 获取请求参数的辅助方法
- 设置响应的辅助方法
- 所有的 Service 实例
- 一些插件提供的对象和方法
所以说 Context 是一个 请求级别的对象,请求生它就生,请求完成它也就无了。
获取方式
需要获取 Request 对象的地方都可以拿到 Context 对象:
- Middleware 中:中间件函数两个参数就是
ctx
和next
- Controller 中:
this.ctx
- Service 中:
this.ctx
- 匿名 Context:
app.createAnonymousContext()
- 定时任务:异步函数以
ctx
作为唯一参数
一般情况下 Context 对象总是伴随着 Request 对象出现。
在某些非用户请求场景(例如启动文件中)需要使用 Context 中的部分属性可以用 app.createAnonymousContext()
方法创建一个匿名 Context 对象:
import { Application, Context } from 'egg'
import { Server } from 'http'
export default function(app: Application) {
app.beforeStart(async () => {
// preload before app start
const ctx = app.createAnonymousContext()
await ctx.service.posts.load()
})
}
一个定时任务例子:
export const task = async (ctx: Context) => {
await ctx.service.posts.refresh()
}
Request & Response
这两哥们儿总是成对出现,Egg.js 的 Request & Response 都是从 Koa 集成来的,是对 Node.js 原生的 HTTP request & HTTP Response 的封装。对象自带了一些列处理 Request & Response 的辅助方法。
获取方式
ctx.request
& ctx.response
。
Koa 会在 Context 上代理一部分 Request & Response 的属性,例如 ctx.request.query
等价于 ctx.query
。
并不是所有属性都会被代理,例如 ctx.response.body
是合法的,而 ctx.body 不存在。
Reference
http://www.wangchonghaha.cn/bookstact/JsServer/Eggjs/objects.html
评论区