nodejs 配置文件处理方案
前言
一般来说:一个好的项目配置应该满足以下条件:
- 依赖环境:配置根据具体运行环境从相应的文件读取
- 代码分离:配置项不仅可以从配置文件读取, 也可以从环境变量读取,使得安全隐秘的配置项与代码分离
-
易于使用:配置项应该是分层配置的,有助于查找条目和维护庞大的配置文件的,应该是容易组织和容易获取的,比如
json
结构
在多人开发 nodejs 项目的时候,没有规划好配置方案,配置文件的问题就很容易暴露出来。
痛点
在开发 nodejs 的工程中,遇到过三个痛点
- 部署环境不同: 开发、测试、生产环境的不同,导致配置的不同
- 开发环境不同: 开发者的开发环境配置不同,会存在同一个配置文件配置项不同,同一文件不同内容提交,容易引起 git 冲突,影响 git 提交更新
- 安全地配置: 一些配置不应该明文保存在项目代码里面,比如数据库密码
解决方案
部署环境不同
对于部署环境不同,相对容易解决,建立相应环境的配置文件,比如:
- 开发环境配置:developmentConfig.js
- 测试环境配置:testConfig.js
- 生产环境配置:productionConfig.js
再建一个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
module.exports = { database: { user: process.env.user || 'root', password: process.env.password || 'yfwzx2019' } }
而更隐秘的办法是,你根本不知道我用环境变量覆盖了配置项值,比如:
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 配置:
var conf = require('rc')(appname, defaultConfigObject)
然后它会从下面列表合并配置,优先级按顺序合并:
- 命令行参数:–user=root 或者对象形式赋值 –database.user=root
- 环境变量: 环境变量前缀为${appname}_的变量 appname_user=root 对象形式 appname_database__user=root
- 指定文件: node index.js –config file
- 默认配置文件: 从
./ ../ ../../ ../../../
等目录查找.${appname}rc
文件 $HOME/.${appname}rc
$HOME/.${appname}/config
$HOME/.config/${appname}
$HOME/.config/${appname}/config
/etc/${appname}rc
/etc/${appname}/config
一个简单的 rc 配置如下:
const rc = require('rc') var conf = require('rc')(process.env.NODE_ENV || 'development', { port: 3000, database: { user: 'root', password: 'yfwzx2019' } }) console.log(conf)
原文地址:https://segmentfault.com/a/1190000017576880
相关推荐
-
iOS 原生混合RN开发最佳实践 框架
2019-3-11
-
我为什么要使用Webpack? 框架
2019-3-9
-
vue权限管理系统 框架
2019-3-17
-
一文读懂NodeJS全栈开发利器:CabloyJS(万字长文) 框架
2019-6-7
-
使用 React 开发 Atom 插件 框架
2017-5-8
-
微信小程序 + 腾讯地图SDK 实现路线规划 框架
2019-3-31
-
Flutter的SPA实战,路由拦截器,全局Toast Loading 框架
2019-10-3
-
如何通过 Vue+Webpack 来做通用的前端组件化架构设计 框架
2017-5-14
-
vue全家桶安装以及修改webpack配置新增vue项目启动方式 框架
2019-6-11
-
超详细多表头位置计算实现 框架
2019-9-11