egg内置对象

摘要:
几乎所有由框架加载器加载的文件都可以导出一个函数,该函数将由加载器调用,并将app用作parameter://app.js模块。exports=app=˃{app.cache=newCache();};获取classUserControllerextendsController{asyncfetch(){//this.appthis.ctx.body=this.app.cache.Get;//this.ctx.app也可以获取this.ctx body=this.ctx.app.cache.Get;}}通过ctx对象Use classUserServiceextendsService{asyncfinch(){this.app;//获取应用程序对象}}1.2ContextContext是一个请求级对象,继承自Koa Context每次接收到用户请求时,框架都实例化Context对象,该对象封装用户请求的信息,并提供许多方便的方法来获取请求参数或设置响应信息。获取ctx。通过Context对象//Requestinstancectx请求。响应;//响应实例1.4 Helper(扩展)Helper用于提供一些实用的实用函数。

http://eggjs.org/zh-cn/basics/objects.html

目录

egg内置对象

框架内置基础对象:从 Koa 继承而来的 4 个对象(Application, Context, Request, Response) 以及框架扩展的一些对象(Controller, Service, Helper, Config, Logger

1.1 Application

Application 是全局应用对象,在一个应用中,只会实例化一个,它继承自 Koa.Application,在它上面我们可以挂载一些全局的方法和对象。我们可以轻松的在插件或者应用中扩展 Application 对象。

几乎所有被框架 Loader 加载的文件(Controller,Service,Schedule 等),都可以 export 一个函数,这个函数会被 Loader 调用,并使用 app 作为参数:

  1. 在启动脚本中获取
// app.js 
module.exports = app => {
  app.cache = new Cache();
};
  1. 在controller中获取
class UserController extends Controller {
  async fetch() {
    // this.app
    this.ctx.body = this.app.cache.get(this.ctx.query.id);
    // this.ctx.app  也可以通过ctx对象获取
    this.ctx.body = this.ctx.app.cache.get(this.ctx.query.id);
  }
}
  1. 在service中使用
class UserService extends Service {
  async fetch() {
    this.app; // 得到Appication对象
  }
}

1.2 Context

Context 是一个请求级别的对象,继承自 Koa.Context。在每一次收到用户请求时,框架会实例化一个 Context 对象,这个对象封装了这次用户请求的信息,并提供了许多便捷的方法来获取请求参数或者设置响应信息。框架会将所有的 Service 挂载到 Context 实例上,一些插件也会将一些其他的方法和对象挂载到它上面(egg-sequelize 会将所有的 model 挂载在 Context 上)。

  1. 中间件中使用
async function middleware(ctx, next) {
  ctx; // ctx is the instance of Context
}
  1. service和controller中使用
this.ctx; // 得到Context实例

1.3 Request and Response

都是请求级别的对象,提供了一系列辅助方法获取Http请求与设置Http响应。

通过Context对象获取

ctx.request; // Request instance
ctx.response; // Response instance

1.4 Helper(扩展)

Helper 用来提供一些实用的 utility 函数。它的作用在于我们可以将一些常用的动作抽离在 helper.js 里面成为一个独立的函数,这样可以用 JavaScript 来写复杂的逻辑,避免逻辑分散各处,同时可以更好的编写测试用例。

通过Context对象获取

ctx.helper; // Helper instance

在模板中使用

{{ helper.shtml(value) }}

编写helper:

helper统一放在 app/extend
五种扩展方式:Application, Context, Request, Response, Helper

  1. Application
    框架会把 app/extend/application.js 中定义的对象与 Koa Application 的 prototype 对象进行合并,在应用启动时会基于扩展后的 prototype 生成 app 对象
    通过框架扩展的形式自定义helper方法
// app/extend/application.js
module.exports = {
  foo(param) {
    // this 就是 app 对象,在其中可以调用 app 上的其他方法,或访问属性
  },
};
// 使用: app.foo
  1. Context
// app/extend/context.js
module.exports = {
  foo(param) {
    // this 就是 ctx 对象,在其中可以调用 ctx 上的其他方法,或访问属性
  },
};
// 使用:ctx.foo
  1. Request
// app/extend/request.js
module.exports = {
  get foo() {
    return this.get('x-request-foo');
  },
};
// 使用: ctx.request.foo
  1. Response
// app/extend/response.js
module.exports = {
  set foo(value) {
    this.set('x-response-foo', value);
  },
};
// 使用: ctx.response.foo
  1. Helper
// app/extend/helper.js
module.exports = {
  foo(param) {
    // this 是 helper 对象,在其中可以调用其他 helper 方法
    // this.ctx => context 对象
    // this.app => application 对象
  },
};
// 使用: ctx.hepler.foo

1.5 Config

通过Application对象获取

app.config; // Config instance

1.6 Logger

分为Application Logger, Context Logger, Controller Logger, Service Logger等,有不同的获取方式

let logger = app.logger; // App Logger
// Context Logger 打印的日志都会在前面带上一些当前请求相关的信息(如 [$userId/$ip/$traceId/${cost}ms $method $url])
logger = ctx.logger; // Context Logger
// Service Logger, Controller Logger本质上就是Context Logger, 不过在打印的时候会额外加上文件路径
logger = this.logger; // 在service或controller中直接获取
// logger 方法
logger.debug();
logger.info();
logger.warn();
logger.error();

免责声明:文章转载自《egg内置对象》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇pymysql的连接Spark RPC框架源码分析(一)简述下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

分享几种Linux软件的安装方法

Linux软件安装由于不同的Linux分支,安装方法也互不相同,介绍几种常见的安装方法。 http://wenku.baidu.com/link?url=hrOBvu_P-joieXLZfbUjkyRXMHC_CgeAZWjTTtiKKZZhcmNBTILoH2he0TJ9GuhCr75ud4IDuZohhHjzK3B_YPhCkWJ30umXLzdJZG...

前端er们如何最快开发h5移动端页面?

声明在前:本文原创,一字一字手打,转载还请消息M我一下,求伸手党手下留情。   一直以来对web移动端的东西做的比较多,总是在做确从来没总结过,于是想对移动端的框架选择到相关技巧,进行一个归纳。首先声明,我也是只萌新,不是大神,肯定会有写得不够严谨的地方,欢迎指正~互相交流,若有忍不了的地方,求轻喷,轻喷,喷.....   以下为正文:   互联网已经进入...

第一次使用Ubuntu20.04系统-遇坑小记

第一次使用Ubuntu20.04系统-遇坑小记 最近发现Linux系统是程序员前进的必经之路(立志做一名“倔强又装逼的程序员”),所以果断在自己的笔记本上安装了最新的Ubuntu20.04系统,刚开始使用确实不是很习惯(应该还是自己比较菜),尤其是许多命令行的操作方式不是很熟悉、操作系统的一些相关知识也不是很了解,不过用了几天,发现Linux(Ubuntu...

自己写了一个war3窗口模式限定鼠标软件

由于魔兽3不支持宽屏,所以需要鼠标限定软件,以前一直是用的shaquila的war3窗口模式限定鼠标软件,他这个软件还算小巧好用,该有的功能都有,基本上也没有什么bug。但用着用着就觉得有点不大爽的地方: 当限定后切换出去比较麻烦。切换时需要首先切换到限定工具的窗口,点击解除锁定,切换回来时要重复该过程;当打开的窗口较多时切换比较麻烦。否则会别强行切换...

七 APPIUM Android 定位方式

1.定位元素应用元素   1.1通过id定位元素 Android里面定位的id一般为resrouce-id: 代码可以这样写: WebElement element = driver.findElement(By.id("com.tencent.mm:id/do")); 或者: driver.findElementById("com.tencent.mm...

Magento入门开发教程

Modules->模块 Controller->控制器 Model->模型 Magento是这个星球上最强大的购物车网店平台。当然,你应该已经对此毫无疑问了。不过,你可能还不知道,Magento同样是一个面向对象的PHP框架。你可以配合Magento购物车程序强大的功能,开发动态WEB应用程序。 这是Magento中文开发手册的开篇,我们...