egg学习

Posted zzl的日常work

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了egg学习相关的知识,希望对你有一定的参考价值。

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() - nowms`);
  ;
;
复制代码

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

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() - nowms`);
  ;
;

注意: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设备才开启

    

  

 

 

 

 

 

 

 

 

 

 

 




































 

Egg入门学习

一:什么是Egg? 它能做什么?
Egg.js是nodejs的一个框架,它是基于koa框架的基础之上的上层框架,它继承了koa的,它可以帮助开发人员提高开发效率和维护成本。
Egg约定了一些规则,在开发中,我们可以按照一套统一的约定进行应用开发,团队内部使用这种方式开发可以减少开发人员的学习成本。

Express也是Node.js的一个框架,express简单且扩展性强,但是express框架缺少了一些约定,不同的开发者会写出不同的代码,适合做个人项目,不太适合团队开发,而Egg它约定了一些规则,对整个团队开发效率会提高。

官网对Egg有如下特性:
1. 可以基于Egg定制上层框架的能力。
2. 高度可扩展的插件机制。
3. 内置多进程管理。
4. 基于koa开发的,性能好。
5. 框架稳定,测试覆盖了高。
6. 渐进性开发。

二:使用egg快速生成项目 (根据官网来学习的)

官网有脚手架提供,只需要如下几条命令即可快速生成项目:如下命令:

npm i egg-init -g
egg-init egg-example --type=simple
cd egg-example
npm i

生成项目后,我们可以使用 npm run dev 启动即可。

我们也可以手动搭建项目:

1. 初始化目录结构:

$ mkdir egg-demo1
$ cd egg-demo1
$ npm init
$ npm i egg --save
$ npm i egg-bin -- save-dev

2. 在package.json文件中加上 scripts 启动命令如下:

{
  "name": "egg-demo1",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "egg-bin dev"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "egg": "^2.14.2"
  },
  "devDependencies": {
    "egg-bin": "^4.9.0"
  }
}

3. 在项目中的跟目录新建 app文件夹,再在下面新建 controller文件夹,在该文件夹下新建 home.js,因此代码如下:

// app/controller/home.js

const Controller = require(‘egg‘).Controller;
class HomeController extends Controller {
  async index() {
    this.ctx.body = ‘Hello world‘;
  }
}
module.exports = HomeController;

4. 在app文件下新建router.js ,配置路由映射,如下代码:

module.exports = app => {
  const { router, controller } = app;
  router.get(‘/‘, controller.home.index);
}

5. 在项目的根目录下新建 config文件夹,在该文件夹下新建 config.default.js, 简单的代码如下:

// 下面是我自己的 Cookie 安全字符串密钥

exports.keys = ‘123456‘;

因此项目的总目录结构如下:

egg-demo1
├── app
│   ├── controller
│   │   └── home.js
│   └── router.js
├── config
│   └── config.default.js
└── package.json

6. 启动项目,使用命令 npm run dev, 如下所示:

技术分享图片

我们打开浏览器访问 http://127.0.0.1:7001/ 可以看到如下所示了:

技术分享图片

三:静态资源

Egg内置了static插件,因此我们可以把静态资源放在 app/public 下即可:目录结构如下:

egg-demo1
├── app
│   ├── controller
│   │   └── home.js
│   └── router.js
│   ├──public
|   | |---css
|   | | |-- index.css
|   | |---js
|   | | |-- index.js
├── config
│   └── config.default.js
└── package.json

四:模板渲染

4.1 有时候我们需要读取数据后渲染模板,然后呈现给用户,因此我们需要引入对应的模板引擎。因此我们可以使用 Nunjucks 来渲染,先安装对应的插件 egg-view-nunjucks

npm i egg-view-nunjucks --save

安装完成后,我们需要开启插件,因此我们需要在 app/config 下新建 plugin.js 来开启插件配置功能,如下代码:

// app/config/plugin.js

exports.nunjucks = {
  enable: true,
  package: ‘egg-view-nunjucks‘
};

在 config/config.default.js 代码也要加上对应的配置,如下代码:

// 下面是我自己的 Cookie 安全字符串密钥
exports.keys = ‘123456‘;

// 添加view配置
exports.view = {
  defaultViewEngine: ‘nunjucks‘,
  mapping: {
    ‘.tpl‘: ‘nunjucks‘
  }
};

4.2 为页面编写模板文件,我们一般是放在 app/view 目录下,因此我们需要在app下再新建一个 view文件夹。

<!-- app/view/index/list.tpl -->
<html>
  <head>
    <title>第一天学习egg</title>
    <link rel="stylesheet" href="/public/css/index.css" />
  </head>
  <body>
    <ul class="view-list">
      {% for item in list %}
        <li class="item">
          <a href = "{{ item.url }}">{{ item.title }}</a>
        </li>
      {% endfor %}
    </ul>
  </body>
</html>

4.3 添加 Controller 代码:代码如下:

// app/controller/index.js

const Controller = require(‘egg‘).Controller;

class IndexController extends Controller {
  async list() {
    const dataList = {
      list: [
        { id: 1, title: ‘今天是我第一天学习egg了‘, url: ‘/index/1‘ },
        { id: 2, title: ‘今天是我第一次学习egg了‘, url: ‘/index/2‘ }
      ]
    };
    await this.ctx.render(‘index/list.tpl‘, dataList);
  }
}

module.exports = IndexController;

4.4 添加 Router 路由,代码如下:

module.exports = app => {
  const { router, controller } = app;
  router.get(‘/‘, controller.home.index);
  router.get(‘/index‘, controller.index.list);
}

现在我们再运行下 npm run dev 后,访问下:http://127.0.0.1:7001/index 就可以看到如下页面了,

技术分享图片

注意:开发期默认开启了 development 插件,修改后端代码后,保存后会重新打包的。

其他的待续~ 慢慢来学习~ 

github上的源码 

以上是关于egg学习的主要内容,如果未能解决你的问题,请参考以下文章

egg.js入门导航:安装使用与学习

egg 学习

egg学习

egg 简单demo学习

egg 简单demo学习

Node.js学习11~基于Egg.js框架,对MySQL数据库实现增删改查操作