Node.js 分布式节点系统中ENV的正确使用

Node.js 分布式节点系统中ENV的正确使用,node.js,environment-variables,distributed-system,Node.js,Environment Variables,Distributed System,我正在构建一个相对复杂的分布式节点系统。假设有两个流程(节点应用程序),A和B。它们在单独的项目中定义 此外,还有两个定制的节点模块,在a和B中都使用。我们称它们为M和N。此外,M使用N 我应该如何正确处理环境变量 我想我应该为两个主进程(A和B)定义.env,从那里处理所有的环境变量,并简单地将所需的环境变量从那里传递到M和N。这样,M和N(以及其他内部模块)将在创建时接收它们自己作为参数传递的环境变量 这种方法正确吗?让模块直接访问进程.env不是一个好主意,而让模块拥有自己的.env文件则

我正在构建一个相对复杂的分布式节点系统。假设有两个流程(节点应用程序),A和B。它们在单独的项目中定义

此外,还有两个定制的节点模块,在a和B中都使用。我们称它们为M和N。此外,M使用N

我应该如何正确处理环境变量

我想我应该为两个主进程(A和B)定义.env,从那里处理所有的环境变量,并简单地将所需的环境变量从那里传递到M和N。这样,M和N(以及其他内部模块)将在创建时接收它们自己作为参数传递的环境变量


这种方法正确吗?

让模块直接访问
进程.env
不是一个好主意,而让模块拥有自己的
.env
文件则是一个更糟糕的主意

  • .env
    文件不应添加到源代码管理(ie git)中,因为它们随环境而变化(
    dev
    prod
    pre-prod
    ),有时还包含敏感信息(如AWS密钥)。因此,每次安装
    node\u模块时,都需要粘贴
    .env
    文件,从而使部署过程更加复杂

  • 模块中加载的
    .env
    文件可能以意外方式与根应用程序的
    .env
    合并(请记住,只有一个
    进程.env

  • 想象一下,您的模块需要在应用程序的两个部分中有不同的行为。如何仅在一个位置覆盖通过
    .env
    文件加载的数据

所以在我看来,你的猜测是正确的:不要把
.env
放在
节点\ u模块中

//这比。。。
nModule.someMethod(process.env.PARAM1、process.env.PARAM2)
//……这
process.env.PARAM1='';
process.env.PARAM2='';
nModule.someMethod();

你的方法听起来是正确的,应该会奏效。定义
.env
文件并使用
dotenv
包时,您将能够访问代码中
.env
内的所有变量。这意味着定制的节点模块也将能够访问它,您不必传递任何信息(您可以使用环境变量的
process.env.NAME\u直接访问它们)

SUMERIZE:在A和B中创建
.env
文件,使用
dotenv
包,然后您可以使用
process.env.NAME\u OF_environment\u VARIABLE
直接访问代码中的环境变量(在自定义节点模块中也是如此)。您可以在模块A和B中创建构造函数(用于自定义模块),只需将process.env.env_作为参数传递。这是更好的方法,因为自定义模块的逻辑将独立于应用程序的其余部分(它将仅取决于输入)

注意:不要将您的
.env
提交给Git,因为
.env
通常有一些机密信息。最佳做法是创建一个
.gitignore
文件并在其中添加
.env


推荐您可以将所有
.env
文件集中存放在一个地方,以便更好地管理。您可以查看一些密码管理工具,如或。

我强烈感觉环境变量是为环境保留的。这对我来说意味着几件事:

  • 在代码内部,这些变量应该是全局变量,即只能通过
    process.env
    访问
  • 它们不会传递给其他模块。当然,使用可以传递给它们导出的函数的参数定制依赖项是一个好主意。但环境不应用于此
  • 如何将值加载到
    process.env
    实际上是一个如何启动程序a和程序B的问题。我个人更喜欢systemd服务,因为它对定义运行时环境有很好的支持。dotenv包看起来更像是一根拐杖,但从程序的角度来看,它很好
    • 您提到了复杂的分布式系统。分发还可以与集线器/集中式密钥/变量管理系统相关联。我假设有许多环境变量在多个应用程序中共享

      如果您创建一个包含所有必需变量并使用身份验证保护它们的集中式节点,这不是一个优点吗

      所有节点(无论应用程序如何)仅维护一个密码字符串,以便通过集中式节点进行身份验证,并从单个.env文件加载所有必需的变量


      或者,您可以使用类似于

      的系统,我想说是的-或者定制的节点模块纯粹用于内部使用,它们可以使用
      process.env
      ,或者它们可以使用从环境变量派生的a&B参数进行初始化。在单片体系结构中,这些挑战并不存在。新的网络、技术和用户需求迫使我们设计像您的设计一样的分布式系统#1您的问题是否仅针对本地主机和库级别#2您使用的是npm模块还是A&B是nodejs web应用程序#3您计划如何在暂存或prod环境中部署应用程序?我有一个策略,可以从基础设施的角度管理分布式环境中的变量。这是一个分布式系统,a和B可以在不同的实例上运行(docker、EC2等等)。两者都创建并使用M和N,它们作为NPM模块实现。我不确定M和N是否应该有自己的.env,还是应该在A或B创建时“注入”env变量。谢谢@Nenad。我想就这样吧,少一点。我只是不希望直接从模块调用config(),避免直接从模块调用process.env.env_。我觉得直接访问pro会更好