egg学习

发布时间 2023-04-26 23:45:16作者: my日常work

1. 可以编写插件,可以进行扩展,约定优于配置

2. egg初始化后的文件目录

 

3. 在config 目录下面的plugin.js 中引入插件,在 config.default.js 中对插件进行配置

Egg.js 中的中间件分为三种类型:全局中间件、插件中间件和路由中间件。全局中间件是在整个应用中生效,而插件中间件和路由中间件只在对应的插件或路由中生效。

 

因此需要包装一下上面写的中间件

module.exports = (options, app) => {
  return async function cost(ctx, next) {
    const now = Date.now();
    await next();
    ctx.set('X-Response-Time', `${Date.now() - now}ms`);
  };
};
复制代码

中间件可以添加配置,允许开发者自定义响应头

module.exports = options => {
  const header = options.header || 'X-Response-Time';

  return async function cost(ctx, next) {
    const now = Date.now();
    await next();
    ctx.set(header, `${Date.now() - now}ms`);
  };
};

注意:egg中扩展都是属性扩展,不是方法扩展


egg的目录结构


4. application 全局对象,只能实例化一次
监听事件 server, HTTP服务启动完毕
error
request
response

获取
app.js
Controller 中 this.app this.context.app 可以拿到

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

可以创建临时Context,能够在Middleware,Conyroller,Service获取,通过createAnonymousContext()获取临时Context

可以通过app.config 从Application实例上获取到Config对象,也可以在Controller,Service,Helper的实例上通过this.config 获取到Config对象

通过EGG_SERVER_ENV=site npm start 设置项目运行环境 通过
app.config.env 获取当前环境

Config 配置
框架提供了强大且可扩展的配置功能,可以自动合并应用、插件、框架的配置。按顺序覆盖且可以根据环境维护不同的配置,合并后的配置可直接从app.config获取

多环境配置
框架支持根据环境来加载配置,定义多个环境的配置文件。
config
  config.default.js
  config.prod.js
  config.unittest.js
  config.local.js

当指定env时会同时加载对应的配置文件,并覆盖默认配置文件的同名配置,如prod环境会加载config.prod.js和config.default.js文件,config.prod.js会覆盖
config.default.js 同名的配置

a.unshift(100)  // js 从数组开头添加元素

通过app.config.coreMiddleware.unshift('report'); // 在框架中添加中间件

在应用中添加中间件,通过app/middleware 文件夹添加中间件

可以通过自己包装或者引入本身符合规范的koa中间件

 

中间件具有通用配置

无论是应用层加载的中间件还是框架自带中间件,都支持几个通用的配置项

enable:控制中间件是否开启

match:设置只有符合某些规则的请求才会经过这个中间件。

ignore:设置符合某些规则的请求不经过这个中间件。

 

在router中传入某个中间件,设置单个路由生效。

1. match 可以设置字符串类型,表示配置的是一个url的路径前缀,所有以配置字符串前缀的url都会匹配上,也可以使用字符串数组

2. 正则:当参数为正则时,直接匹配满足正则验证的url的路径

3. 函数:当参数为一个函数时,会将请求上下文传递给这个函数,最终取函数返回结果(true/false)来判断是否匹配。

module.exports = {

  gzip: {

    match(ctx) {

       // 只有ios设备才开启

    }

  }

}