配置文件

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

  • 支持按环境变量加载不同的配置文件,如 config.local.js, config.prod.js 等等。
  • 应用/插件/框架都可以配置自己的配置文件,框架将按顺序合并加载。

框架支持根据环境来加载配置,定义多个环境的配置文件,比如:

config
|- config.default.js
|- config.prod.js
|- config.unittest.js
|- config.local.js

config.default.js 为默认的配置文件,所有环境都会加载这个配置文件,一般也会作为开发环境的默认配置文件。

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

环境变量

框架有两种方式指定运行环境:

  1. 通过 config/env 文件指定,该文件的内容就是运行环境,如 prod。一般通过构建工具来生成这个文件。
  2. 通过 EGG_SERVER_ENV 环境变量指定。

其中,方式 2 比较常用,因为通过 EGG_SERVER_ENV 环境变量指定运行环境更加方便,比如在生产环境启动应用:

$ EGG_SERVER_ENV=prod npm start

框架默认支持的运行环境及映射关系(如果未指定 EGG_SERVER_ENV 会根据 NODE_ENV 来匹配)

NODE_ENV EGG_SERVER_ENV 说明
local 本地开发环境
test unittest 单元测试
production prod 生产环境

例如,当 NODE_ENV 为 production 而 EGG_SERVER_ENV 未指定时,框架会将 EGG_SERVER_ENV 设置成 prod。

其他环境可自定义, 比如 SIT 和 UAT

配置加载顺序

应用、插件、框架都可以定义这些配置,而且目录结构都是一致的,但存在优先级(应用 > 框架 > 插件),相对于此运行环境的优先级会更高。

比如在 prod 环境加载一个配置的加载顺序如下,后加载的会覆盖前面的同名配置。

-> 插件 config.default.js
-> 框架 config.default.js
-> 应用 config.default.js
-> 插件 config.prod.js
-> 框架 config.prod.js
-> 应用 config.prod.js

配置写法

配置文件返回的是一个 object 对象,可以覆盖框架的一些配置,应用也可以将自己业务的配置放到这里方便管理。

// 配置 logger 文件的目录,logger 默认配置由框架提供
module.exports = {
  logger: {
    dir: '/home/admin/logs/demoapp',
  },
};

配置文件也可以简化的写成 exports.key = value 形式

exports.keys = appInfo => appInfo.name + '_1558660014544_1342';
exports.logger = {
  level: 'DEBUG',
};

配置文件也可以返回一个 function,可以接受 appInfo 参数

// 将 logger 目录放到代码目录下
const path = require('path');
module.exports = appInfo => {
  return {
    logger: {
      dir: path.join(appInfo.baseDir, 'logs'),
    },
  };
};

内置的 appInfo 有

appInfo 说明
pkg package.json
name 应用名,同 pkg.name
baseDir 应用代码的目录
HOME 用户目录,如 admin 账户为 /home/admin
root 应用根目录,只有在 local 和 unittest 环境下为 baseDir,其他都为 HOME。

appInfo.root 是一个优雅的适配,比如在服务器环境我们会使用 /home/admin/logs 作为日志目录,而本地开发时又不想污染用户目录,这样的适配就很好解决这个问题。

配置合并

在不同环境, 将会按照一定规则合并配置, 比如在开发模式, 会合并 config.default.jsconfig/config.local.js

配置的合并使用 extend2 模块进行深度拷贝,extend2 fork 自 extend,处理数组时会存在差异。

比如:

// config/config.default.js
exports.robot = {
  a: 1,
  ua: [
    /Baiduspider/i,
  ],
};
// config/config.local.js
// only read at development mode, will override default
exports.robot = {
  b: 2,
  ua: [
    /curl/i,
  ],
};
// app/middleware/test.js
module.exports = (options, app) => {
  console.log('robot: ', app.config.robot); // robot:  { a: 1, ua: [ /curl/i ], b: 2 }
  return async function testMiddleware(ctx, next) {
    await next();
  };
};

获取方式

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

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress