侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

Egg03 - 从 Koa 继承来的四个基本对象

barwe
2022-04-14 / 0 评论 / 0 点赞 / 598 阅读 / 1,832 字
温馨提示:
本文最后更新于 2022-04-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Egg.js 从 Koa 继承了四个基本对象:Application, Context, RequestResponse


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 中:中间件函数两个参数就是 ctxnext
  • 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

0

评论区