egg 学习笔记

115 阅读3分钟

app目录结构

  • egg会依据此目录以及其对应的所有约定的子目录。及各个子目录对应的js文件名。构建一个应用的实例对象。该对象通常是在入口处使用,如Vue在main中使用,app更多是在router中使用。因为router解析后会为每个router分配一个ctx,相当于vue中的单页面实例this

  • 相当于vue中Vue实例。各个页面中的this。对应egg中各自的ctx。区别是一个是单页面,一个是多页面

  • 每个ctx是在路由被解析后但还没被分配具体控制器时就被分配了。同样,全局注入的中间件也是在此时执行。

  • 全局注入的中间件 相当于vue-route中的beforEach, 在具体路由里使用,相当于vue页面中的beforeRouteEnter

config

  • 相当于vue.config.js ,webpack.config.js等项目一系列的全局配置。如插件的注册plugins.js文件,模板文件的编译配置,相当于v-loader,css-loader。 中间件的注册,以及中间件参数的配置

  • config 的对象会注册在egg的底层架构上。如service。controller 等class类中。所以 可以在所有继承类的类文件中通过this来直接获取config配置

  • 对app实例属性的配置扩展

  • plugin.js 中对应的就是vue中的Mixin混入。混入extend,middleware等一系列文件。是应用层面的混入。可以取自本地文件夹。也可以通过npm获取

  • extend是业务层面的混入

  • package.json中通过egg属性指定其framework对应的egg开发框架。

controller 文件视图数据的控制层

  • 将视图模型与业务数据绑定。相当于vue中的script,区别是vue中的script只能单视图。而这是一组视图

  • 每个js文件返回一个继承Controller类的class,都是一个组视图模型及相关业务数据的集合。

  • ctx.render函数渲染模板。类似于vue中的template。里面包含底层应用的所有全局属性。如helper,ctx,app等.也可以通过参数的形式传入值

extend

  • 将js文件中的对象,以文件名方式,扩展到上下文实例对象上对应的属性名的对象上。

  • contxt-ctx,helper-ctx.helper, request:ctx-request, response:ctx-response,application-app,agent-agent

  • extend 是对上下文实例的扩展。

  • 所有扩展的属性,在模板中使用{{ 扩展对象名.扩展属性 }}

中间件middleware

  • 所谓的中间件,就是给使用者提供自定义过程。类似vue中的钩子函数。gulp中的管道插件等等

  • 与service,extend,controller一样,会将目录文件夹下的js文件依据文件层级,在app对象上构建出对象属性

  // add your middleware config here 全局注册中间件,所有的请求都会调用
  config.middleware = [];

视图模板 view

  • 全局或当前视图对象ctx能在模板里直接使用。类似vue中的template

  • 模板可以是html或tpl文件

  • 在模板中可以直接使用 javascript 条件语句。用<%--%>包裹

  • 自动结构出上下文对象上的属性值。即凡是ctx对象上的属性都可以直接使用

config 配置

/* eslint valid-jsdoc: "off" */

'use strict';

/**
 * @param {Egg.EggAppInfo} appInfo app info
 */
module.exports = appInfo => {
  /**
   * built-in config
   * @type {Egg.EggAppConfig}
   **/
  const config = exports = {};

  // use for cookie sign key, should change to your own and keep security
  config.keys = appInfo.name + '_1620711317285_8121';

  // add your middleware config here
  config.middleware = [];

  config.security = {
    csrf: {
      enable: false,
    },
    domainWhiteList: ['*']
  };

  config.mysql = {
    // database configuration
    client: {
      // host
      host: '***',
      // port
      port: '**',
      // username
      user: 'root',
      // password
      password: '***',
      // database
      database: '**',
      timezone: "08:00"
    },
    // load into app, default is open
    app: true,
    // load into agent, default is close
    agent: false,
  };
  config.cors = {
    // origin: ctx => ctx.get('origin'),
    domainWhiteList: ['http://127.0.0.1:9000', 'http://127.0.0.1:3000'],
    credentials: true,  //允许Cook可以跨域
    allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS'
  };
  // add your user config here
  const userConfig = {
    // myAppName: 'egg',
  };
  //接口统一返回格式
  config.responseJson = (data, code = 200, msg = '') => ({
    data,
    code,
    msg
  })
  config.cluster = {
    listen: {
      path: '',
      port: 7000,
      hostname: '0.0.0.0',
    }
  };
   config.session = {
     key: 'SESSION_ID',
     maxAge: 1800000,  //过期时间 30分钟
     httpOnly: true,
     encrypt: true,
     renew: true //延长会话有效期 
   }
  return {
    ...config,
    ...userConfig,
  };
};