配置

Config / 配置

实际项目中,肯定需要各种配置,包括:框架需要的配置以及项目自定义的配置。ThinkJS 将所有的配置都统一管理,文件都放在 src/config/ 目录下(多模块项目放在 src/common/config/),并根据不同的功能划分为不同的配置文件。

  • config.js 通用的一些配置
  • adapter.js adapter 配置
  • router.js 自定义路由配置
  • middleware.js middlware 配置
  • validator.js 数据校验配置
  • extend.js extend 配置

配置格式

// src/config.jsmodule.exports = {port: 1234,redis: {host: '192.168.1.2',port: 2456,password: ''}
}

配置值即可以是一个简单的字符串,也可以是一个复杂的对象,具体是什么类型根据具体的需求来决定。

多环境配置

有些配置需要在不同的环境下配置不同的值,如:数据库的配置在开发环境和生产环境是不一样的,此时可以通过环境下对应不同的配置文件来完成。

多环境配置文件格式为:[name].[env].js,如:config.development.jsconfig.production.js

在以上的配置文件中,目前只有 config.js 和 adapter.js 是支持不同环境配置文件的。

系统默认配置

系统内置一些默认配置,方便项目里直接使用,具体有:

  • config.js 通用的默认配置 { port: 8360, // server port // host: '127.0.0.1', // server host, the default config removed from 3.1.0 workers: 0, // server workers num, if value is 0 then get cpus num createServer: undefined, // create server function startServerTimeout: 3000, // before start server time reloadSignal: 'SIGUSR2', // reload process signal stickyCluster: false, // sticky cluster, add from 3.1.0 onUnhandledRejection: err => think.logger.error(err), // unhandledRejection handle onUncaughtException: err => think.logger.error(err), // uncaughtException handle processKillTimeout: 10 * 1000, // process kill timeout, default is 10s jsonpCallbackField: 'callback', // jsonp callback field jsonContentType: 'application/json', // json content type errnoField: 'errno', // errno field errmsgField: 'errmsg', // errmsg field defaultErrno: 1000, // default errno validateDefaultErrno: 1001 // validate default errno };

配置合并方式

系统启动时,会对配置合并,最终提供给开发者使用。具体流程为:

  • 加载 [ThinkJS]/lib/config/config.js
  • 加载 src/config/config.js
  • 加载 src/config/config.[env].js
  • 加载 [ThinkJS]/lib/config/adapter.js
  • 加载 [ThinkJS]/lib/config/adapter.[env].js
  • 加载 src/config/adapter.js
  • 加载 src/config/adapter.[env].js

[env] 为当前环境名称。最终会将这些配置按顺序合并在一起,同名的 key 后面会覆盖前面的。

配置加载是通过 think-loader 模块实现的,获取到合并后的配置后,通过 think-config 模块实例化后放在 think.config 上,后续通过 think.config 来获取或者设置配置。

使用配置

框架提供了在不同的环境下不同的方式快速获取配置:

  • 在 ctx 中,可以通过 ctx.config(key) 来获取配置
  • 在 controller 中,可以通过 controller.config(key) 来获取配置
  • 其他情况下,可以通过 think.config(key) 来获取配置

实际上,ctx.config 和 controller.config 是基于 think.config 包装的一种更方便的获取配置的方式。

const redis = ctx.config('redis'); //获取 redis 配置
module.exports = class extends think.Controller {indexAction() {const redis = this.config('redis'); // 在 controller 中通过 this.config 获取配置}
}

动态设置配置

除了获取配置,有时候需要动态设置配置,如:将有些配置保存在数据库中,项目启动时将配置从数据库中读取出来,然后设置上去。

框架也提供了动态设置配置的方式,如:think.config(key, value)

// src/bootstrap/worker.js//HTTP 服务启动前执行
think.beforeStartServer(async () => {const config = await think.model('config').select();think.config('userConfig', config); //从数据库中将配置读取出来,然后设置
})

常见问题

能否将请求中跟用户相关的值设置到配置中?

不能。配置设置是全局的,会在所有请求中生效。如果将请求中跟用户相关的值设置到配置中,那么多个用户同时请求时会相互干扰。

config.js 和 adapter.js 中的 key 能否重名?

不能。由于 config.js 和 adapter.js 是合并在一起的,所以要注意这二个配置不能有相同的 key,否则会被覆盖。

怎么查看合并后的所有配置?

系统启动时,会合并 config.js 和 adapter.js 的配置,最终会将配置写到文件 runtime/config/[env].json 文件中,如:当前 env 是 development,那么写入的文件为 runtime/config/development.json

配置写入文件时,是通过 JSON.stringify 将配置转化为字符串,由于 JSON.stringify 不支持正则、函数等之类的转换,所以配置中由于字段的值是正则或者函数时,生成的配置文件中将看不到这些字段对应的值。

多模块项目配置文件存放位置?

以上文档中描述的配置文件路径都是单模块项目下的,多模块项目下配置文件的路径为 src/common/config/,配置文件名称以及格式和单模块相同,如:src/common/config/config.jssrc/common/config/adapter.jssrc/common/config/middleware.js 等。

多模块项目下有些配置可以放在模块目录下,路径为:/src/[module]/config/[module] 为具体的模块名称。

如何查看配置文件的详细加载情况?

有时候希望查看配置文件的详细加载情况,这时候可以通过 DEBUG=think-loader-config-* npm start 来启动项目查看。

think-loader-config-40322 load file: //demo/app/config/adapter.js +3ms
think-loader-config-40323 load file: /demo/node_modules/thinkjs/lib/config/adapter.js +5ms
think-loader-config-40320 load file: /demo/app/config/adapter.js +4ms
think-loader-config-40323 load file: /demo/app/config/adapter.js +3ms
think-loader-config-40325 load file: /demo/app/config/config.js +0ms
think-loader-config-40325 load file: /demo/node_modules/thinkjs/lib/config/adapter.js +5ms
think-loader-config-40325 load file: /demo/app/config/adapter.js +3ms
think-loader-config-40321 load file: /demo/app/config/config.js +0ms
think-loader-config-40321 load file: /demo/node_modules/thinkjs/lib/config/adapter.js +5ms
think-loader-config-40321 load file: /demo/app/config/adapter.js +3ms
think-loader-config-40324 load file: /demo/app/config/config.js +0ms
think-loader-config-40319 load file: /demo/app/config/config.js +0ms
think-loader-config-40319 load file: /demo/node_modules/thinkjs/lib/config/adapter.js +6ms
think-loader-config-40324 load file: /demo/node_modules/thinkjs/lib/config/adapter.js +5ms
think-loader-config-40319 load file: /demo/app/config/adapter.js +7ms
think-loader-config-40324 load file: /demo/app/config/adapter.js +8ms

由于服务是通过 Master + 多个 Worker 启动的,debug 信息会打印多遍,这里为了区分加上了进程的 pid 值,如:think-loader-config-40322为进程 pid 为 40322 下的配置文件加载情况。

thinkjs-redis配置问题相关推荐

  1. 基于redis的简易分布式爬虫框架

    代码地址如下: http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需, ...

  2. Redis+SSO初步

    经过好几天的查找和各种追问,今天终于算是对sso有个大概的了解,不过在网上sso大部分都需要依赖于Redis,所以我这里先安装Redis 由于电脑问题安装不了Linux,我就直接安装Windows版本 ...

  3. 解决Redis报错Redis is configured to save RDB snapshots, but it is currently not able to persist on disk

    Redis报错信息 在Spring Boot中集成Redis客户之后,进行数据操作,发现报如下错误: org.springframework.data.redis.RedisSystemExcepti ...

  4. yii2设置session时间_关于 Swoft 2.0 版本用 Redis 存储 session 时配置问题

    Swoft 2.0 在 session 配置上和 1.0 还是有一些不同地方,而关于这些在 github 上完全没有任何说明,甚至连文档也没有.经过逐步梳理源代码(其中要理解他的 "注解&q ...

  5. sau交流学习社区--基于thinkjs+vue+redis+mysql+es6开发的周报企业管理系统weekly

    weekly 周报系统主要是node+vue+redis+mysql+es6,一个企业管理系统,企业员工汇报每周工作情况,以及完成情况,各级负责人可以查看和提醒相应未写周报人员. ,后端完全使用nod ...

  6. 调试笔记 — Redis 消息队列发布信息被消费者重复订阅多次牵扯到的 Tomcat 配置问题 [#00001]

    最近在项目中发现了一个奇葩的 BUG ,当用户调用后台时,后台向消息队列中发布一条消息,这条消息会被监听器(消费者)监听到,有趣的事情就在这里,此时由于只发送了一条消息,照理说监听器应该只会触发一次, ...

  7. java连接redis无法连接,报异常RedisConnectionException

    不管是spring还是原生jedis连接redis,如果连不上多半是linux服务器的问题: 1 首先确保redis端口开放: 把6379或者redis的端口开放即可 2 redis.conf配置注释 ...

  8. 配置redis禁用几个危险命令

    这几天客户一直给我反映一个问题,那就是他的缓存服务器redis每天会清理库,很纳闷,我配置的redis一般保持的默认,不应该会每天去清理库的,感觉应该还是他的程序上有点问题吧. 不过,不管程序问题还是 ...

  9. 29 | 案例篇:Redis响应严重延迟,如何解决?

    在访问商品搜索接口时,我们发现接口的响应特别慢.通过对系统 CPU.内存和磁盘 I/O 等资源使用情况的分析,我们发现这时出现了磁盘的 I/O 瓶颈,并且正是案例应用导致的. 接着,我们借助 pids ...

  10. 主机无法连接虚拟机中的redis服务

    解决:主机<本地>无法连接虚拟机中的redis服务 首先保证虚拟机网络已经和主机网络互通,即相互ping对方IP,能ping通但是仍然连不上redis服务,可能是以下问题. redis服务 ...

最新文章

  1. P1494 小Z的袜子
  2. IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)
  3. 语言 双线性内插_合资插混间的实力较量,微蓝6 PHEV和卡罗拉双擎E+谁更值得选...
  4. 首次合作带给我的感想
  5. HDU5985 Lucky Conins 概率题
  6. alertmanager 告警恢复_Prometheus配置企业微信告警
  7. qtp11安装及入门
  8. 计算机操作入门基础知识,电脑入门基本操作知识
  9. 小学计算机优秀说课稿ppt,【说课备考】各学科说课稿示范第7天 — 小学信息技术...
  10. MFC列表控件report报表可编辑操作
  11. 访问局域网计算机切换用户,Win7切换用户账户访问共享文件夹的方法
  12. java程序员生日祝福语_给程序员的一句话祝福语
  13. 异数OS 星星之火(一)-- 异数OS-织梦师云 用户使用手册
  14. C++设计模式17:中介者模式
  15. 手机dpi修改工具_修改手机的分辨率,让你的手机更流畅
  16. 克转换成千克怎么算python_磅到公斤和克的转换python函数
  17. Mac os下快速从终端进入Finder 从Finder进入终端
  18. 将QLV视频格式转换为MP4格式
  19. 各厂内推整理 | 第五期
  20. 泛微oa 控制行显示、隐藏

热门文章

  1. Arduino与Proteus仿真实例-温控风扇仿真
  2. 【信息论是什么?信息,消息和信号?】信息论与编码入门(一)
  3. Arcgis小技巧【12】——ArcGIS标注的各种用法和示例
  4. 武汉理工大学余家头校区计算机学院研究生宿舍(男生)条件如何,2021年武汉理工大学新生宿舍环境内部图片,男生女生宿舍条件(图)...
  5. 【集合论】划分 ( 划分 | 划分示例 | 划分与等价关系 )
  6. apache优化速度--嗖嗖嗖
  7. 超级表格上线消息提醒功能了~
  8. gprs java_WISMO模块GPRS上网设置的过程
  9. deepin安装瑞昱Realtek无线网卡8188GU驱动
  10. 各种疑似DGA域名大全