热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Node.js配置文件管理方法详解与最佳实践

本文详细介绍了Node.js中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。

web前端|js教程nodejs配置文件处理办法介绍
node.js
web前端-js教程
本篇文章给大家带来的内容是关于nodejs配置文件处理的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
shopuo源码,vscode对css插件,ubuntu 烧录映像,tomcat监控项,sqlite编辑器查询,骷髅爬虫幼年体的相关资料,php session类,上饶seo推广推荐,discuz 整合网站登录,网页预览本地图片,好的手机整形医院模板lzw
一般来说:一个好的项目配置应该满足以下条件:
免费视频聊天直播网站源码,香橙派装Ubuntu,tomcat8 跨域访问,爬虫软件采集视频,php程序员提升自己,上海 seo外包lzw
依赖环境:配置根据具体运行环境从相应的文件读取
员工评价源码,ubuntu 增强音量,tomcat8集群部署,头上有爬虫感,php正则表达式库,seo系列含义lzw
代码分离:配置项不仅可以从配置文件读取, 也可以从环境变量读取,使得安全隐秘的配置项与代码分离

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

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

痛点

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

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

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

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

解决方案

部署环境不同

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

开发环境配置:developmentConfig.js

测试环境配置:testConfig.js

生产环境配置:productionConfig.js

再建一个config.js配置文件作为入口获取配置,如下:

module.exports = require(`./${process.env.NODE_ENV}Config.js`)

引用配置的时候,只要引用 config.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,其实最后会被环境变量的值覆盖,运行如下:

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

实操

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

rc 模块

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

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

命令行参数:–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

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


推荐阅读
  • Egg.js 中间件详解与应用实例
    Egg.js 的中间件机制与 Koa 类似,均采用洋葱模型。每当开发一个中间件时,就像是在洋葱外增加了一层。本文将通过一个简单的中间件示例,详细介绍 Egg.js 中间件的编写方法及其应用场景,帮助读者更好地理解和使用这一功能。 ... [详细]
  • 深入解析微信小程序开发中的全局配置文件设置与优化技巧
    本文深入探讨了微信小程序开发中全局配置文件的设置与优化技巧,详细解析了 `app.js`、`app.json`、`app.wxss` 和 `project.config.json` 的功能与最佳实践。通过合理配置这些文件,开发者可以显著提升小程序的性能和用户体验。文章还介绍了如何利用这些配置文件进行模块化开发和调试,帮助开发者更好地管理和维护小程序项目。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 如果程序使用Go语言编写并涉及单向或双向TLS认证,可能会遭受CPU拒绝服务攻击(DoS)。本文深入分析了CVE-2018-16875漏洞,探讨其成因、影响及防范措施,为开发者提供全面的安全指导。 ... [详细]
  • 大家好,我是梅巴哥er。本文将深入探讨Redux框架中的第三个实战案例,具体实现每两秒自动点击按钮以触发颜色变化的功能。该案例中,一个关键点在于是否需要使用异步操作来处理定时任务,我们将详细分析其必要性和实现方式。通过这一实例,读者可以更好地理解Redux在实际项目中的应用及其异步处理机制。 ... [详细]
  • 2017年12月7日:React中实现不同组件间的路由导航
    在React应用中,实现从首页到不同组件的路由导航是常见的需求。本文介绍了如何通过配置路由来实现这一功能。具体步骤包括:1. 在首页设置路由链接,使其能够跳转到不同的目标组件;2. 确保目标组件正确配置,特别是在导入时使用默认导出(`default`),以确保路由能够正常工作。此外,文章还提供了详细的代码示例,帮助开发者更好地理解和实现这一功能。 ... [详细]
  • 在 Angular Google Maps 中实现图片嵌入信息窗口的功能,可以通过使用 `@agm/core` 库来实现。该库提供了丰富的 API 和组件,使得开发者可以轻松地在地图上的信息窗口中嵌入图片。本文将详细介绍如何配置和使用这些组件,以实现动态加载和显示图片的功能。此外,还将探讨一些常见的问题和解决方案,帮助开发者更好地集成这一功能。 ... [详细]
  • 在 CentOS 6.6 系统中搭建 MONO 和 Jexus 以支持 ASP.NET 及 MVC 应用的运行环境配置指南
    本文提供了在 CentOS 6.6 系统上配置 MONO 和 Jexus 以支持 ASP.NET 及 MVC 应用的详细步骤。首先,确保本机环境为 CentOS 6.6,并使用阿里云的 YUM 源来安装必要的软件包,包括 gcc、gcc-c++、bison、pkgconfig 和 glib2-devel。这些软件包是构建和运行 MONO 环境的基础,确保系统能够顺利支持 ASP.NET 和 MVC 应用的部署和运行。 ... [详细]
  • 二叉树的直径是指树中任意两个叶节点之间最长路径上的节点数量。本文深入解析了计算二叉树直径的算法,并提出了一种优化方法,以提高计算效率和准确性。通过详细的案例分析和性能对比,展示了该优化算法在实际应用中的优势。 ... [详细]
  • 如何在Android设备上通过应用程序创建浏览器书签 ... [详细]
  • 本文详细介绍了 Windows API 中的按钮控件及其应用实例。主要功能包括:1. `CheckDlgButton` 用于更改对话框中按钮的选中状态;2. `CheckRadioButton` 用于设置单选按钮的选中状态。此外,还探讨了按钮控件在实际开发中的多种应用场景,帮助开发者更好地理解和使用这些功能。 ... [详细]
  • 基于域名、端口和IP的虚拟主机构建方案
    本文探讨了在单台物理服务器上构建多个Web站点的虚拟主机方案,详细介绍了三种主要的虚拟主机类型:基于域名、基于IP地址和基于端口的虚拟主机。每种类型的实现方式及其优缺点均进行了深入分析,为实际应用提供了全面的技术指导。 ... [详细]
  • Node.js 中的椭圆曲线 Diffie-Hellman 密钥交换方法 `crypto.createECDH()` 使用详解 ... [详细]
  • 如何在 Node.js 环境中将 CSV 数据转换为标准的 JSON 文件格式? ... [详细]
author-avatar
丁可丁可_136
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有