Egg.js框架学习

框架内置基础对象

  • Application

Application(简写为app) 是全局应用对象,在一个应用中,只会实例化一个,在应用启动时被创建,在它上面我们可以挂载一些全局的方法和对象

获取方式

Application 对象几乎可以在编写应用时的任何一个地方获取到,几乎所有被框架 Loader 加载的文件(Controller,Service,Schedule 等),都可以 export 一个函数,这个函数会被 Loader 调用,并使用 app 作为参数

  • ctx.app
  • ControllerMiddlewareHelperService中都可以通过 this.app 访问到 Application对象,例如 this.app.config访问配置对象。
  • 在 app.js 中 app 对象会作为第一个参数注入到入口函数中
// app.js   app.js 泛指Egg框架内的的js文件!!!
module.exports = app => {
  // 使用 app 对象
};
  • Controller

框架提供了一个 Controller 基类,并推荐所有的 Controller 都继承于该基类实现。这个 Controller 基类有下列属性:

  • ctx 当前请求的 Context 实例。

  • app 应用的 Application 实例。

  • config 应用的配置

  • service 应用所有的 service

  • logger 为当前 controller 封装的 logger 对象。

在 Controller 文件中,可以通过两种方式来引用 Controller 基类:

// app/controller/user.js

// 从 app 实例上获取(推荐)
module.exports = app => {
   return class UserController extends app.Controller {
   // implement
};
};

// 从 egg 上获取
const egg = require('egg');
module.exports = class UserController extends egg.Controller {
   // implement
};
  • 自定义 Controller 基类
    我们可以通过在app.js里面为Controller添加一些常用的方法(比如在请求成功或失败的时候给客户端返回数据时的固定格式等)来提高我们的开发效率:
// app.js
module.exports = app => {
  class CustomController extends app.Controller {
    get user() {
      return this.ctx.session.user;
    }
    success(data) {
      this.ctx.body = {
        success: true,
        data,
      };
    }
    notFound(msg) {
      msg = msg || 'not found';
      this.ctx.throw(404, msg);
    }
  }
  app.Controller = CustomController;
}

这样的方法在任何一个扩展自Controller的类都可以调用。方便、快捷。

//  app/controller/search.js
module.exports = app => {
  class SearchController extends app.Controller {
    * index() {
      // this.ctx.body = `search: ${this.ctx.query.name}`;

      // 调用基类来返回成功或者失败的数据
      const res = {
        name: '四月天',
        nickName: '老程',
        age: 26,
      };
      this.success(res);
    }
  }
  return SearchController;
};
  • Context

Context 是一个请求级别的对象,在每一次收到用户请求时,框架会实例化一个 Context 对象,这个对象封装了这次用户请求的信息,并提供了许多便捷的方法来获取请求参数或者设置响应信息。

获取方式

最常见的 Context 实例获取方式是在 Middleware, Controller 以及 Service 中。

1.controller中获取

// app/controller/home.js

module.exports = app => {
  class HomeController extends app.Controller {
    * index() {
      this.ctx.body = 'hi, egg,6666啊!!';
    }
  }
  return HomeController;
};
  • Request & Response

Request 是一个请求级别的对象,继承自 Koa.Request。封装了 Node.js 原生的 HTTP Request 对象,提供了一系列辅助方法获取 HTTP 请求常用参数。

Response 是一个请求级别的对象,继承自 Koa.Response。封装了 Node.js 原生的 HTTP Response 对象,提供了一系列辅助方法设置 HTTP 响应。

  • 获取方式

可以在 Context的实例上获取到当前请求的 Request(ctx.request) 和 Response(ctx.response) 实例。
查看具体怎样来获取HTTP请求的参数 ;

  • Service

框架提供了一个 Service 基类,并推荐所有的 Service 都继承于该基类实现。
Service 基类的属性和 Controller 基类属性一致,访问方式也类似:

// app/service/user.js

// 从 app 实例上获取(推荐)
module.exports = app => {
    return class UserService extends app.Service {
    // implement
};
};

// 从 egg 上获取
const egg = require('egg');
module.exports = class UserService extends egg.Service {
    // implement
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,285评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,252评论 1 23
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,224评论 22 257