Egg 企业级框架

重要通知

基本概况

安装配置

日志模块

工程结构与目录文件

工程结构

├─ app
│ ├─ controller # 控制器,响应用户的输入请求
│ ├─ ├─ home.js
│ ├─ service # 业务逻辑层
│ ├─ ├─ user.js
│ ├─ schedule # 调度
│ ├─ extend # 扩展
│ ├─ ├─ helper.js
│ ├─ ├─ request.js
│ ├─ ├─ response.js
│ ├─ ├─ context.js
│ ├─ ├─ application.js
│ ├─ └─ agent.js
│ ├─ public # 静态资源
│ ├─ middleware # 中间件
│ ├─ view # 模板文件
│ ├─ model # 领域模型
│ └─ router.js # 配置 URL 路由规则
├─ config # 多环境配置,具名配置项会覆盖默认配置文件的同名配置
│ ├─ config.global-prod.js # 国际-生产环境
│ ├─ config.global-test.js # 国际-测试环境
│ ├─ config.prod.js # 国内-生产环境
│ ├─ config.test.js # 国内-测试环境
│ ├─ config.local.js # 本地环境
│ ├─ config.unit-test.js # 单元测试
│ └─ config.default.js # 默认的配置文件,所有环境都会加载这个配置文件
└─ test # 单元测试

多环境配置 package.json

注意单元测试npm run test与测试环境的命名冲突问题

  • –daemon 是否允许在后台模式
{
  "scripts": {
    "build:global": "egg-scripts start --daemon --env=global-prod --title=egg-server-example", // config.global-prod.js、config.default.js
    "build:global:test": "egg-scripts start --daemon --env=global-test --title=egg-server-example", // config.global-test.js、config.default.js
    "build": "egg-scripts start --daemon --env=prod --title=egg-server-example", // config.prod.js、config.default.js
    "build:test": "egg-scripts start --daemon --env=test --title=egg-server-example", // config.test.js、config.default.js

    "start": "egg-scripts start --daemon --title=egg-server-cool-admin-api_node", // config.prod.js、config.default.js
    "stop": "egg-scripts stop --title=egg-server-cool-admin-api_node",
    "dev": "egg-bin dev", // config.local.js、config.default.js

    "test": "npm run start"
  }
}

运行指令

npm run dev # 本地环境运行

config.default.js

export default (appInfo) {
  const config = {};

  // 签名配置项
  config.signature = {
    secretId: '',
    secretKey: '',
    timeStamp: '', // 时间戳
  };

  // 数据库配置项
  config.mysql = {};
  config.mongodb = {};
  config.redis = {
    host: '10.199.182.11',
    port: 7099,
    account: '',
    password: ''
  };

  // 日志配置项
  config.logger = {
    dir: '', // 目录
    fileName: '', // 文件名称
  };

  // 服务器配置项
  config.server = {};

  // 基础环境配置项
  config.env = {
    domain: '', // 域名
  };

  // OSS配置项
  config.oss = {};

  return {
    ...config
  };
}

路由配置:app/router.js

module.exports = app => {
  const { router, controller } = app;

  // 返回目录文件app/controller/home.js中index函数的业务逻辑
  router.get('/', controller.home.index);

  // 返回目录文件app/controller/home.js中home函数的业务逻辑
  router.get('/info', controller.home.info);
};

读取变量: app/controller/home.js

'use strict';

const { Controller } = require('egg');

class HomeController extends Controller {
  async index() {
    const { ctx } = this;
    ctx.body = 'hi, egg';
  }

  async info() {
    // 每一次用户请求,框架都会实例化对应的 Service 实例
    const { 
      ctx, // 当前请求的上下文 Context 对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法。
      app, // 当前应用 Application 对象的实例,通过它我们可以拿到框架提供的全局对象和方法。
      service, // 应用定义的 Service,通过它我们可以访问到其他业务层,等价于 this.ctx.service 。

      config, // 应用运行时的配置项。

      logger // logger 对象,上面有四个方法(debug,info,warn,error),分别代表打印四个不同级别的日志,使用方法和效果与 context logger 中介绍的一样,但是通过这个 logger 对象记录的日志,在日志前面会加上打印该日志的文件路径,以便快速定位日志打印位置。
    } = this;


    // 获取config.default.js中signature对象
    console.info(config.signature);
    // 也可以这样获取
    console.info(ctx.app.config.defineOptions);


    ctx.body = {
      name: `hello ${ctx.params.id}`,
    };
  }
}

module.exports = HomeController;

读取变量: 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;

常见问题与释疑

工程化建设方案

性能调优最佳实践

生态系统

工程实战示例

工程实战示例基于

工程结构目录

相关配置文件

核心业务代码

特别注意事项

体系源码

Last Updated:
Contributors: 709992523