(一)egg-基础功能

  • 快速上手
  • 目录结构
  • 内置对象
    • (1)Application
    • (2)Context
    • (3)response & request
    • (4)Controller
    • (5)service & helper & Config & logger
  • 中间件
    • 中间件的编写
    • 中间件的使用
    • 通用配置
  • 路由
    • 参数获取
  • 控制器
  • 服务

快速上手

npm install egg --type = simple

可选的骨架类型
simple - 简单的egg应用程序骨架
empty - 空的egg应用程序骨架
plugin - egg plugin骨架
Framework - egg framework骨架

目录结构

`app/router.js` 用于配置 URL 路由规则
`app/controller/**` 用于解析用户的输入,处理后返回相应的结果
`app/service/**` 用于编写业务逻辑层
`app/middleware/**` 用于编写中间件
`app/public/**` 用于放置静态资源
`app/extend/**` 用于框架的扩展
`config/config.{env}.js` 用于编写配置文件
`config/plugin.js` 用于配置需要加载的插件
`test/**` 用于单元测试
`app.js 和 agent.js` 用于自定义启动时的初始化工作
`app/schedule/**` 用于定时任务
`app/view/**` 用于放置模板文件
`app/model/**` 用于放置领域模型

内置对象

(1)Application

全局应用对象,可以将一些全局的方法和对象挂载到上面,

事件
application包含的事件有

  • server 在http服务完成启动之后,将HTTP server通过该事件暴露出来。
  • error 异常事件
  • request 收到请求触发
  • response 响应请求触发

一般需要在应用启动期间进行一些初始化工作,初始化完成之后才可对外提供服务,egg框架提供了统一的入口文件-app.js进行启动过程的自定义,app.js返回一个boot类,可以在该类的声明周期方法中执行启动应用的初始化工作。

包含的声明周期方法有:

生命周期方法 说明
configDidLoad 配置文件加载完成
configWillLoad 配置文件即将加载,修改配置文件的最终时机
didLoad 文件加载完成
willReady 插件启动完毕
didReady worker准备就绪
serverDidReady 应用启动完成
beforeClose 应用即将关闭

Application对象的获取方式

  • 作为参数
  • 在context对象上,通过ctx.app
  • 在继承于controller和service基类的实例中,可以通过this.app访问到

(2)Context

context是请求级别的对象,收到的用户请求会实例化一个context对象,该对象封装了用户的请求信息,框架将所有的Service挂载在context实例上。

获取方式

  • 在controller中获取 this.ctx
  • 在sevice中获取 this.ctx
  • middleware中,this或ctx
  • 在非用户请求情况下需要访问service/model等context实例上的对象
// app.js
module.exports = app => {app.beforeStart(async () => {const ctx = app.createAnonymousContext();// preload before app startawait ctx.service.posts.load();});
}
  • 定时任务,使用ctx作为参数

(3)response & request

获取方式

  • ctx.request
  • ctx.response
    获取post的body内容应该使用ctx.request.body

(4)Controller

egg框架提供了controller基类,并推荐所有的controller均继承该基类实现。
其包含如下属性:

  • ctx :当前请求的context实例
  • app:application实例
  • config:应用的配置
  • service:应用的所有service
  • logger:日志对象

(5)service & helper & Config & logger

  • sevice:内置service基类,并推荐所有service继承此基类 属性同controller

  • helper:提供一些实用的utility函数,可以通过ctx.helper获取请求的helper实例
    可以通过框架扩展的形式自定义helper的方法。

  • config:通过app.config获取到config对象,也可以在controller sevice helper上通过this.config获取

  • logger: 包含以下几种方法

logger.debug();  logger.info();  logger.warn();   logger.error();

中间件

中间件的编写

(1)写法

// app/middleware/gzip.js
const isJSON = require('koa-is-json');
const zlib = require('zlib');module.exports = options => {return async function gzip(ctx, next) {await next();// 后续中间件执行完成后将响应体转换成 gziplet body = ctx.body;if (!body) return;// 支持 options.thresholdif (options.threshold && ctx.length < options.threshold) return;if (isJSON(body)) body = JSON.stringify(body);// 设置 gzip body,修正响应头const stream = zlib.createGzip();stream.end(body);ctx.body = stream;ctx.set('Content-Encoding', 'gzip');};
};

(2)配置

一个中间件接收两个参数:

  • options:中间件的配置项(如上代码)
  • app:当前Application的实例

中间件的使用

(1)在应用中使用

在config.default.js中配置,最终在启动时合并到app.config.appMiddleware

module.exports = {// 配置需要的中间件,数组顺序即为中间件的加载顺序middleware: [ 'gzip' ],// 配置 gzip 中间件的配置gzip: {threshold: 1024, // 小于 1k 的响应体不压缩},
};

(2)在框架和插件中使用

不支持在config.default.js中配置

// app.js
module.exports = app => {// 在中间件最前面统计请求时间app.config.coreMiddleware.unshift('report');
};// app/middleware/report.js
module.exports = () => {return async function (ctx, next) {const startTime = Date.now();await next();// 上报请求时间reportTime(Date.now() - startTime);}
};

(3)在router中使用中间件

上述两种方式配置的中间件是全局的,会处理每一次请求,若指向针对单个路由生效,可以直接在app/router.js中实例化和挂载。

module.exports = app => {const gzip = app.middleware.gzip({ threshold: 1024 });app.router.get('/needgzip', gzip, app.controller.handler);
};

框架和插件加载的中间件会在应用层配置的中间件之前,框架默的中间件不可被应用层中间件覆盖,若有同名会报错。

通用配置

  • enable:控制中间件是否开启。
module.exports = {bodyParser: {enable: false,},
};
  • match:设置只有符合某些规则的请求才会经过这个中间件。
module.exports = {gzip: {match: '/static',},
};
  • ignore:设置符合某些规则的请求不经过这个中间件。

路由

用来描述请求url和具体承担执行动作的Controller的对应关系,app/router.js用于统一所有路由规则。

router.verb('path-match', app.controller.action);
router.verb('router-name', 'path-match', app.controller.action);
router.verb('path-match', middleware1, ..., middlewareN, app.controller.action);
router.verb('router-name', 'path-match', middleware1, ..., middlewareN, app.controller.action);
  • verb: HTTP方法
  • router-name:路由别名
  • path-match - 路由 URL 路径。
  • middleware1 - 在 Router 里面可以配置多个 Middleware。
  • controller - 指定路由映射到的具体的 controller 上,controller 可以有两种写法:
    app.controller.user.fetch - 直接指定一个具体的 controller
    'user.fetch' - 可以简写为字符串形式

参数获取

(1)query

// app/router.js
module.exports = app => {app.router.get('/search', app.controller.search.index);
};// app/controller/search.js
exports.index = async ctx => {ctx.body = `search: ${ctx.query.name}`;
};// curl http://127.0.0.1:7001/search?name=egg

(2)params

// app/router.js
module.exports = app => {app.router.get('/user/:id/:name', app.controller.user.info);
};// app/controller/user.js
exports.info = async ctx => {ctx.body = `user: ${ctx.params.id}, ${ctx.params.name}`;
};// curl http://127.0.0.1:7001/user/123/xiaoming

(3)复杂参数

// app/router.js
module.exports = app => {app.router.get(/^\/package\/([\w-.]+\/[\w-.]+)$/, app.controller.package.detail);
};// app/controller/package.js
exports.detail = async ctx => {// 如果请求 URL 被正则匹配, 可以按照捕获分组的顺序,从 ctx.params 中获取。// 按照下面的用户请求,`ctx.params[0]` 的 内容就是 `egg/1.0.0`ctx.body = `package:${ctx.params[0]}`;
};// curl http://127.0.0.1:7001/package/egg/1.0.0

(4)表单

// app/router.js
module.exports = app => {app.router.post('/form', app.controller.form.post);
};// app/controller/form.js
exports.post = async ctx => {ctx.body = `body: ${JSON.stringify(ctx.request.body)}`;
};

表单校验

// app/router.js
module.exports = app => {app.router.post('/user', app.controller.user);
};// app/controller/user.js
const createRule = {username: {type: 'email',},password: {type: 'password',compare: 're-password',},
};exports.create = async ctx => {// 如果校验报错,会抛出异常ctx.validate(createRule);ctx.body = ctx.request.body;
};

控制器

controller主要对用户的请求参数进行处理(校验和转换),然后调用对应的service方法处理业务,得到业务结果后封装并返回。
项目中的controller类继承于egg.controller,有以下属性挂在this上

  • this.ctx:请求的上下文对象的实例,可以通过其拿到框架处理好的各种属性和方法。
  • this.app:获取全局对象和方法
  • this.service:访问业务层,等价this.ctx.service
  • this.config:对应配置项
  • this.logger:日志

服务

service可以进行复杂的数据处理,比如数据库信息获取后的规则计算,第三方服务信息的调用等。

// app/service/user.js
const Service = require('egg').Service;class UserService extends Service {async find(uid) {const user = await this.ctx.db.query('select * from user where uid = ?', uid);return user;}
}module.exports = UserService;

sevice层提供的属性

  • this.ctx
  • this.app
  • this.sevice
  • this.config
  • this.logger

其中this.ctx包含以下属性和方法

  • this.ctx.curl:发起网络调用
  • this.ctx.service.otherService:调用其他service
  • this.ctx.db:发起数据库调用。

(一)egg-基础功能相关推荐

  1. 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能

    相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询 自APIJSON发 ...

  2. php实现文件夹管理器,php实现文件管理与基础功能操作

    文件的基本操作 先来看一下PHP文件基础操作,请看强大注释 var_dump(filetype("./img/11.png")); //判断返回得是文件还是目录,返回sile为文件 ...

  3. 以服务的方式提供站点基础功能支持

    Web站点除了提供内容展示,业务逻辑处理外,还有很多看不到的操作,如:错误日志,后台管理,权限分配,访问统计等.如果只有一个站点,完全可以根据需要逐步添加,但实际的情况是往往有多个子站点,这时这些重复 ...

  4. python PIL(pillow) Image模块的基础功能

    引用文章: python之PIL模块基础功能 https://www.cnblogs.com/watertaro/p/9074453.html

  5. 《SAP CRM管理与实施指南》一一2.2 SAP CRM基础功能

    本节书摘来自华章计算机<SAP CRM管理与实施指南>一书中的第2章,第2.2节,作者:邹荫文 著,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.2 SA ...

  6. 小米手机系统服务组件是干什么的_怎么查看小米手机MIUI系统的基本功能-小米手机MIUI系统基础功能查询方法讲解...

    小米手机是国产品牌手机中口碑较好的手机之一,受到大家的喜爱,配置功能丰富,价格实惠.亲们或许都不知道怎么查看小米手机MIUI系统的基本功能,小编很高兴为大家解决这个问题,接下来就为大家奉上小米手机MI ...

  7. bitwig编曲软件linux,Bitwig 中文视频教程——注册安装和基础功能入门

    为了让刚接触Bitwig软件和初学者更方便的注册下载和上手软件,我们特别制作了Bitwig Studio的入门中文视频教程.视频教程对于完整版的Bitwig Studio以及16-Track和8-Tr ...

  8. 钉钉功能介绍_平棉集团组织召开阿里钉钉办公系统基础功能培训会

    4月11日上午,平棉集团在总部26楼多媒体会议室组织召开阿里钉钉办公系统基础功能培训会,邀请河南一一信息技术公司经理杨杉前来授课.集团公司董事长张先顺及公司领导陈亚民.王仲山.王向阳.陶尚林,各生产经 ...

  9. 实现一个简易版的微博,包含 client 和 server 两部分,并实现四个基础功能:关注、取关、发微博、获取用户微博列表

    const assert = require('assert'); const question = '实现一个简易版的微博,包含 client 和 server 两部分,并实现四个基础功能:关注.取 ...

  10. 平滑滤波器模板尺寸与平滑效果的关系_用PPT基础功能,教你打造发布会效果,这骚操作谁顶得住啊?...

    说到PPT动画,很多人都会想到发布会的那些超炫效果. 如果,我说,这些动画效果,用你PPT上的基础功能,就可以轻松做出来,你信吗? 不信的就看完这篇文章-- 我还附带了视频讲解,手把手教你哦~ 今天先 ...

最新文章

  1. !!!光线对视频识别技术的影响
  2. Java的OOP三大特征之一——多态
  3. shell脚本spawn_如何使用child_process.spawn将Python / Ruby / PHP Shell脚本与Node.js集成
  4. 从数据库导出数为生成excel表
  5. TableViewCell,TableView,UITableViewCell
  6. MySQL 面试必备 8 个知识点
  7. ubuntu报警邮件服务简单搭建
  8. Excel图表4——平均线图
  9. 省级面板数据(1990-2019):能源生产等(原油、石油、焦炭、原煤、天然气等)stata或excel版本
  10. C语言读bin文件内容
  11. Radon变换理论介绍
  12. juce 消息 发送和接收以及
  13. 点击程序不弹出界面,但有后台服务
  14. server酱php推送代码,多种语言调用Server酱推送微信模板消息
  15. PHP在线咨询留言系统
  16. 推荐一款精美小众的读书笔记app
  17. 无法访问windows安装服务_最好用的内外网测速工具, speedtest 服务器搭建指南
  18. Android 8.0 状态栏信号显示、信号定制
  19. 新媒体运营绩效考核标准
  20. 【实战案例】python进行自动网上考试

热门文章

  1. Dds和cc哪一个对服务器伤害大
  2. Wireshark使用(捕获过滤器、显示过滤器、TCP交互抓包示例、抓取本地回环数据包等)
  3. 排列组合公式 与24点编程游戏
  4. 泡面吧——简单的斐波那契序列
  5. vue3-tauri-chat:基于tauri聊天实例|tauri仿微信客户端
  6. Final Cut Pro 10.4.9中文版
  7. Apexテストコード作成の落とし穴
  8. xp打印服务器win10的系统连接不上,win10连上xp共享的打印机无法打印为什么
  9. 解决浏览器弹出 安全警告当前网页正在视图打开您的受信任的站点列表中的站点,您想允许这样做吗?
  10. 线上打印马上送,支持线上打印文档的软件