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

本篇文章给大家带来的内容是关于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

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

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

├── 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

登录后复制

关于部署环境的不同,获取配置通过设置环境变量NODE_ENV来适配

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

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

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

以上就是nodejs配置文件处理的方法介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2734871.html

(0)
上一篇 2025年3月8日 01:10:08
下一篇 2025年3月7日 06:03:40

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JavaScript中链表的详细介绍

    本篇文章给大家带来的内容是关于javascript中链表的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 链表和数组 大家都用过js中的数组,数组其实是一种线性表的顺序存储结构,它的特点是用一组地址连续的存储单元依…

    2025年3月8日 编程技术
    200
  • nodejs搭建web服务器的方法

    本篇文章给大家带来的内容是关于nodejs搭建web服务器的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 前端获取数据时经常会遇到跨域问题,用 nginx 做反向代理就可以解决此问题。但是 nginx 属于中间件代理…

    编程技术 2025年3月8日
    200
  • JavaScript中二叉树(二叉堆)的介绍(代码示例)

    本篇文章给大家带来的内容是关于javascript中二叉树(二叉堆)的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 二叉树 二叉树(Binary Tree)是一种树形结构,它的特点是每个节点最多只有两个分…

    2025年3月8日 编程技术
    200
  • JavaScript二叉树(二叉搜索树)的详细介绍

    本篇文章给大家带来的内容是关于javascript二叉树(二叉搜索树)的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 可能有一部分人没有读过我上一篇写的二叉堆,所以这里把二叉树的基本概念复制过来了,如果读过的人可…

    2025年3月8日 编程技术
    200
  • JavaScript中归并排序的介绍(代码示例)

    本篇文章给大家带来的内容是关于JavaScript中归并排序的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(pi…

    2025年3月8日
    200
  • Javascript隐式转换怎么用?(代码示例)

    本篇文章给大家带来的内容是关于javascript隐式转换怎么用?(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 确定两个变量是否相等是编程中的一个非常重要的操作。在比较字符串、数值和布尔值的相等性时,问题还比…

    编程技术 2025年3月8日
    200
  • NodeJs中Fs模块的详细介绍(代码示例)

    本篇文章给大家带来的内容是关于nodejs中fs模块的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Fs模块 fs.stat 检测是文件还是目录 //目录fs.stat(‘html’, functio…

    编程技术 2025年3月8日
    200
  • NodeJs的CommonJs和NodeJs中自定义模块的介绍

    本篇文章给大家带来的内容是关于nodejs的commonjs和nodejs中自定义模块的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 CommonJs和NodeJs中自定义模块 1、什么是CommonJs 教程里巴拉…

    2025年3月8日
    200
  • 浏览器与Node的事件循环(Event Loop)之间的区别总结

    本篇文章给大家带来的内容是关于浏览器与node的事件循环(event loop)之间的区别总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 本文我们将会介绍 JS 实现异步的原理,并且了解了在浏览器和 Node 中 Ev…

    2025年3月8日 编程技术
    200
  • Webpack的Bundle Split和Code Split有什么区别?(详解)

    本篇文章给大家带来的内容是关于webpack的bundle split和code split有什么区别?(详解)有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 话说之前也是对 chunk 这个概念有些模糊,并且很多时候网上的…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论