时间:2021-05-25
前言
一般来说:一个好的项目配置应该满足以下条件:
在多人开发 nodejs 项目的时候,没有规划好配置方案,配置文件的问题就很容易暴露出来。
痛点
在开发 nodejs 的工程中,遇到过三个痛点
解决方案
部署环境不同
对于部署环境不同,相对容易解决,建立相应环境的配置文件,比如:
再建一个config.js配置文件作为入口获取配置,如下:
module.exports = require(`./${process.env.NODE_ENV}Config.js`)引用配置的时候,只要引用 config.js 即可。
运行命令如下:
NODE_ENV=development node index.js开发环境不同
对于开发环境不同,导致每个人的developmentConfig.js不同,这个不能要求别人的配置和你的一样,这样项目就太硬了。
我们可以把developmentConfig.js添加到.gitignore,从而从项目分离出来,再在readme.md说明如何配置developmentConfig.js。
最好是建立一个developmentConfig.example.js,并在文档说明复制成developmentConfig.js后修改配置项符合自己的开发配置。
安全地配置
对于项目一些安全性要求高的配置项,我们应该从配置文件脱离出来,只能在当前的运行进程可以获取, 配置文件的配置项再读取进程的配置项值,比如数据库密码, 一般做法如下:
productionConfig.js
而更隐秘的办法是,你根本不知道我用环境变量覆盖了配置项值,比如:
productionConfig.js
module.exports = { database: { user: 'root', password: 'yfwzx2019' }}一般人拿到了这个配置,就会以为数据库的账号密码就是root、yfwzx2019,其实最后会被环境变量的值覆盖,运行如下:
node index.js --database.user=combine --database.password=tencent2019当然,是要做了一些处理才可以这样配置。
实操
方案有了,我们先来介绍以下 nodejs 的配置模块 rc模块
rc 模块
使用rc模块需要定义一个appname,选择rc模块是因为它会尽可能多的从appname命名相关的地方读取配置。
使用也很简单,先实例一个 rc 配置:
然后它会从下面列表合并配置,优先级按顺序合并:
做了个 demo, 直观一点
var conf = require('rc')('development', { port: 3000,})console.log(JSON.stringify(conf))// 1、直接运行// node index.js// { port: 3000, _: [] }// 2、加上命令行参数// node index.js --port=4000 --database.user=root// { port: 4000, _: [], database: { user: 'root' } }// 3、加上环境变量// development_port=5000 development_database__password=yfwzx2019 node index.js // {"port":"5000","database":{"password":"yfwzx2019"},"_":[]}// 4、指定配置文件:根目录建一个配置文件 config.json, 内容如下// {// "port": "6000"// }// node index.js --config=config.json// {"port":"6000","_":[],"config":"config.json","configs":["config.json"]}// 5、默认读取 ${appname}rc 文件:根目录见一个配置文件 .developmentrc 内容如下:// {// "port": 7000 // }// node index.js// {"port":7000,"_":[],"configs":[".developmentrc"],"config":".developmentrc"}// 6、 5 和4 一起运行// node index.js --config=config.json// {"port":"6000","_":[],"config":"config.json","configs":[".developmentrc","config.json"]}具体操作
看了 rc 模块,可以满足我们的需求,我们可以配置公共的配置项,也可以隐秘的覆盖我们的配置项。
创建配置文件目录,添加配置文件
其中 .developmentrc.example 是开发环境的例子,然后开发人员参考建 .developmentrc 文件, index.js 是配置入口文件,内容如下:
let rc = require('rc')// 因为 rc 是从 process.cwd() 向上查找 .appnamerc 文件的,我们在根目录 config 文件夹里面的是找不到的,要改变工作路径到当前,再改回去var originCwd = process.cwd()process.chdir(__dirname)var conf = rc(process.env.NODE_ENV || 'production', { // 默认的共同配置 origin: 'default', baseUrl: 'http://google.com/api', enableProxy: true, port: 3000, database: { user: 'root', password: 'yfwzx2019' }})process.chdir(originCwd)module.exports = conf以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
有些框架本身就支持多配置文件,例如RubyOnRails,nodejs下的expressjs。python下的Flask虽然本身支持配置文件管理,但单纯使用fr
Android读取properties配置文件的实例详解因为一些配置信息,多处用到的。且以后可能变更的,我想写个.prorperties配置文件给管理起来。我把
JSPSpring配置文件中传值的实例详解通过spring提供方法,在配置文件中取传值调用get方法targetObject:指定调用的对象propertyPa
web.xml中如何设置配置文件的加载路径实例详解web应用程序通过Tomcat等容器启动时,会首先加载web.xml文件,通常我们工程中的各种配置文件,如日志
0x00:前言参考之前的《MyBatis中SqlMapConfig配置文件详解》记了一下MyBatis中的核心配置文件各个标签的作用和使用场景,这篇文章细说一下