• 技术文章 >web前端 >js教程

    nodejs配置文件处理的方法介绍

    不言不言2019-01-02 09:51:03转载2934
    本篇文章给大家带来的内容是关于nodejs配置文件处理的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    一般来说:一个好的项目配置应该满足以下条件:

    1. 依赖环境:配置根据具体运行环境从相应的文件读取

    2. 代码分离:配置项不仅可以从配置文件读取, 也可以从环境变量读取,使得安全隐秘的配置项与代码分离

    3. 易于使用:配置项应该是分层配置的,有助于查找条目和维护庞大的配置文件的,应该是容易组织和容易获取的,比如json结构

    在多人开发 nodejs 项目的时候,没有规划好配置方案,配置文件的问题就很容易暴露出来。

    痛点

    在开发 nodejs 的工程中,遇到过三个痛点

    1. 部署环境不同: 开发、测试、生产环境的不同,导致配置的不同

    2. 开发环境不同: 开发者的开发环境配置不同,会存在同一个配置文件配置项不同,同一文件不同内容提交,容易引起 git 冲突,影响 git 提交更新

    3. 安全地配置: 一些配置不应该明文保存在项目代码里面,比如数据库密码

    解决方案

    部署环境不同

    对于部署环境不同,相对容易解决,建立相应环境的配置文件,比如:

    1. 开发环境配置:developmentConfig.js

    2. 测试环境配置:testConfig.js

    3. 生产环境配置: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'
        }
    }

    一般人拿到了这个配置,就会以为数据库的账号密码就是rootyfwzx2019,其实最后会被环境变量的值覆盖,运行如下:

    node index.js --database_user=combine --database_password=tencent2019

    当然,是要做了一些处理才可以这样配置。

    实操

    方案有了,我们先来介绍以下 nodejs 的配置模块 rc模块

    rc 模块

    使用rc模块需要定义一个appname,选择rc模块是因为它会尽可能多的从appname命名相关的地方读取配置。
    使用也很简单,先实例一个 rc 配置:

    var conf = require('rc')(appname, defaultConfigObject)

    然后它会从下面列表合并配置,优先级按顺序合并:

    1. 命令行参数:--user=root 或者对象形式赋值 --database.user=root

    2. 环境变量: 环境变量前缀为${appname}_的变量 appname_user=root 对象形式 appname_database__user=root

    3. 指定文件: node index.js --config file

    4. 默认配置文件: 从 ./ ../ ../../ ../../../等目录查找.${appname}rc文件

    5. $HOME/.${appname}rc

    6. $HOME/.${appname}/config

    7. $HOME/.config/${appname}

    8. $HOME/.config/${appname}/config

    9. /etc/${appname}rc

    10. /etc/${appname}/config

    做了个 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 模块,可以满足我们的需求,我们可以配置公共的配置项,也可以隐秘的覆盖我们的配置项。

    1. 创建配置文件目录,添加配置文件

    ├── config
    │   ├── .developmentrc.example
    │   ├── .productionrc
    │   ├── .testrc
    │   └── index.js

    其中 .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
    1. 关于部署环境的不同,获取配置通过设置环境变量NODE_ENV来适配

    2. 关于开发环境的不同,在.gitignore添加config/.developmentrc,项目代码去掉开发环境配置.developmentrc,开发人员根据.developmentrc.example建直接的开发配置.developmentrc

    3. 关于安全地配置,通过添加环境变量覆盖默认值,可以安全隐秘地覆盖配置项,比如:

    NODE_ENV=production node index.js --database.password=tencent2019

    以上就是nodejs配置文件处理的方法介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:node.js
    上一篇:JavaScript中散列表(哈希表)的详细介绍(代码示例) 下一篇:JavaScript中链表的详细介绍
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• NodeJS的Promise的用法解析_javascript技巧• Windows 系统下设置Nodejs NPM全局路径_node.js• Nodejs如何搭建Web服务器_node.js• 快速掌握Node.js之Window下配置NodeJs环境_node.js• Nodejs如何复制文件_node.js• 使用NodeJs 开发微信公众号(三)微信事件交互实例_node.js• nodejs 中模拟实现 emmiter 自定义事件_node.js
    1/1

    PHP中文网