-
内置对象
-
Application: 全剧应用对象,一个应用中只会实例化一个,可以在上面挂在一些全局的方法和对象 -> 扩展 Application 对象 (感觉类似window?)
- 事件:在框架运行时,会在Application实例上触发一些事件,可监听事件做一些操作。应用开发一般在启动自定义脚本中进行监听,框架提供了统一的入口文件(
app.js
)进行启动过程自定义,这个文件只返回一个函数var Cache = require('js-cache'); module.exports = app => { app.cache = new Cache(); //server: 一个worker进程只会触发一次,在http服务完成启动后,会将http server通过此事件暴露给开发者 app.once('server', server => { console.log(server); }); //error: 运行时任何异常被onerror插件捕获后,都会触发error事件, //将错误对象和关联到上下文(如果有)暴露给开发者,可以进行自定义的日志上报等处理 app.on('error', (err, ctx) => { console.log(err, ctx); }) //应用收到请求和响应请求时,分别触发request和response事件,并将当前请求上下文暴露出来,可记录日志 app.on('request', ctx => { console.log(ctx); }) app.on('response', ctx => { console.log(ctx); }); };
-
访问方式
- 在context对象上可通过ctx.app获得
- Controller, Middleware, Helper, Service中都可以通过this.app访问到Application对象,如this.app.config访问配置对象
- 在app.js中Application对象会作为第一个参数注入到入口函数中module.exports = app => { //app.xxx }
- 事件:在框架运行时,会在Application实例上触发一些事件,可监听事件做一些操作。应用开发一般在启动自定义脚本中进行监听,框架提供了统一的入口文件(
-
Context:是一个请求级别的对象。在每一次收到用户请求时,框架会实例化一个Context对象,这个对象封装了这次用户请求的信息,并提供了许多便捷的方法来获取请求参数或者设置响应信息。框架会将所有的Service挂载到Context实例上,一些插件也会将一些其他方法和对象挂载到它上面
- 获取方式
- Service : 作为参数ctx传入
- Controller : this.ctx
- Middleware:
- koa v1: (关键词)this is instance of Context
- koa v2: (参数)ctx is instance of Context
- 除了请求外,在有些非用户请求的场景下我们需要访问service/model等Context实例上的对象,可以通过Application.createAnonymousContext()方法创建一个匿名Context实例:
var Cache = require('js-cache'); module.exports = app => { app.cache = new Cache(); app.beforeStart(async () => { const ctx = app.createAnonymousContext(); // preload before app start await ctx.servive.posts.load(); }) };
-
在定时任务中的每一个task都接受一个Context实例作为参数,以便执行一些定时的业务逻辑:
exports.task = async ctx => { await ctx.service.posts.refresh(); };
- 获取方式
-
Request & Response : 请求级别的对象,有一系列获取http请求常用参数和设置http响应的方法
- 获取方法:
- 可以在Context的实例上获取到当前请求的Request(ctx.request)和Response(ctx.response)实例。
- koa会在Context上代理一部分方法和属性(可简写):
ctx.request.query.id
===ctx.query.id ctx
.response.body
===ctx.body。 但ctx.request.body !==
ctx.body
- 获取方法:
-
Controller: 框架提供一个Controller基类,并推荐所有的Controller都继承(extends Controller)于该基类实现。
- 基类有以下属性:
- ctx:当前请求的Context实例
- app:应用的Application实例
- config:应用的配置
- service:应用所有的service
- logger:为当前controller封装的logger对象
- 引用Controller基类方式:
'use strict'; //从 egg 上获取(推荐) const Controller = require('egg').Controller; class HomeController extends Controller { async index() { this.ctx.body = 'Hello world'; } async fetch() { this.ctx.body = this.app.cache.get(this.ctx.query.id); } } module.exports = HomeController; //从 app 实例上获取 module.exports = app => { return class HomeController extends app.Controller { //.. } }
- 基类有以下属性:
-
Service: 全都同Controller类
-
Helper:用来提供一些实用的utility函数。我们可以将一些常用的动作抽离在helper.js里成为独立函数。Helper自身是一个类,有和Controller基类一样的属性,它会在每次请求时进行实例化,因此Helper上的所有函数也能获取到当前请求相关的上下文信息
- 获取方式:
- 可以在Context实例上获取到当前请求的Helper(ctx.helper)实例。
- 还可以在模版中获取到,如在模版中获取security插件提供的shtml方法。{{ helper.shtml(value) }}
- 自定义helper方法
// app/extend/helper.js module.exports = { formatUser(user) { return only(user, ['name', 'phone']); } };
- 获取方式:
-
Config: 配置文件
- 获取方式
- Application: app.config
- Controller / Service / Helper:this.config
- 获取方式
-
Logger 日志 每个logger对象都提供了4个级别的方法:logger.debug() / logger.info() / logger.warn() / logger.error() 框架中提供了多个Logger对象
- App Logger : 通过app.logger获取 ,可以做一些应用级别的日志记录,如记录启动阶段的一些数据信息,记录一些业务上与请求无关的信息
- App CoreLogger: 通过app.coreLogger获取,开发应用时不应使用,框架和插件则需要它打印日志,区分应用和框架打印的日志,与Logger的日志在不同文件
- Context Logger:通过ctx.logger从Context实例上获取到它,与请求相关,它打印的日志前会带上一些当前请求相关的信息,(如
[$userId/$ip/$traceId/${cost}ms $method $url]
) - Context CoreLogger:通过ctx.coreLogger获取,只有框架和插件会通过它来记录日志。
- Controller Logger & Service Logger :在Controller Service实例上通过this.logger获取,它本质上就是一个Context Logger,不过在打印日志的时候还会额外的加上文件路径。
-
Subscription: 规范化订阅模型的基类,可根据自己的需求基于它订阅规范,如定时任务
-
const Subscription = require('egg').Subscription; class Schedule extends Subscription { // 可以为async function 或 generator function async subscribe() {} }
-