【问题标题】:Node js express project how to add environment variablesNode js express项目如何添加环境变量
【发布时间】:2019-06-06 02:00:00
【问题描述】:

我是一名 java 脚本全栈开发人员。 在 vue js 中,我在根目录下创建了两个文件。

  1. env.development
  2. env.production

在我的main.js 文件中,我可以像这样访问环境变量

process.env.VUE_APP_MY_VARIABLE_X

vue js 中生产和开发的不同之处在于, 如果我使用 npm run serve 项目加载开发环境变量。如果我使用 npm run build 它需要生产环境变量。这一切都在 vue 中。

但是在我的expressjs 项目中,

"start": "nodemon server.js --exec babel-node -e js",

此命令将始终负责运行项目。我在 vue 中找不到两个命令。我浏览了每个人都说使用名为 dotenv 的包的教程。

我不知道这个包如何识别生产环境和开发环境。

一天结束时,我想在本地机器上将数据库密码设置为 123456,在服务器上设置 root@123456。我怎样才能做到这一点?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    据我了解 您没有创建和设置配置文件,并且在您的 app.js 或任何其他文件中需要它。让我们看看例如创建配置文件

     const config = {
            "development":{
                "host":"localhost",
                "dbport":"27017",
                "port":"",
                "username":"",
                "password":"",
                "userdb":"",
                "passworddb":"123456",
                "authSource":"",   
                "database":"devDB"
    },
            "staging":{
                "host":"",
                "dbport":"",
                "port":"",
                "username":"",
                "password":"",
                "passworddb":"@123456",
                "database":"stageDB",
            }, 
            "production":{
                "host":"",
                "dbport":"",
                "port":"",
                "userdb":"",
                "passworddb":"@123456",
                "username":"",
                "password":"",
                "database":"prodDB",
            }
    
        };
        module.exports = config;
    

    然后您在 .env 文件中设置了一个变量,例如 NodeENV = 'prod' 然后将其导入到您的文件中,例如

    var config = require('./config')["process.env.NodeENV"];
    

    最后一件事 dotenv 仅用于将环境变量从 .env 文件加载到 process.env 中。

    【讨论】:

    • node js 怎么知道这是生产,这是暂存,这是开发?
    • 创建一个文件名 .env 然后设置声明的变量,例如 NodeENV = 'prod' ... 当你想以 dev 身份运行你的代码时,然后将此值更改为 dev 像 NodeENV = 'dev ' 与舞台相同。请记住,您可以设置所需的变量名称
    • 向您的应用程序提供存储敏感信息的配置是一种不好的做法。切勿将不同的环境存储在同一个文件中。此外,该示例丢失了错误:自定义“NodeENV”变量、“prod”与“production”以及process.env.NodeENV 作为字符串而不是变量传递。此外,使用.js 可执行文件(通过require())传递配置和变量,很容易出现严重问题——例如,如果你的“配置”文件中有错字,整个应用程序将崩溃。配置/变量应该始终是静态的。最好使用config 包而不是这样做。
    【解决方案2】:

    Vue.js 会根据命令自动处理模式(例如,serve 设置 NODE_ENV=development,而 build 设置 NODE_ENV=production)。 根据模式,它还会自动从磁盘加载带有变量的文件。

    Node.JS 中的环境变量

    然而,Node.JS 默认不这样做,你必须设置你的应用程序来处理环境变量。

    在 Node.JS 中,您可以通过 shell 命令传递变量,例如: MY_VARIABLE=x node myapp.js(通过在命令前添加变量),这将在您的myapp.js 应用程序中为您提供process.env.MY_VARIABLE。 按照这种行为,使用NODE_ENV 变量来设置环境模式已达成共识。 对于生产用途,您将使用 NODE_ENV=production node myapp.js 启动您的应用程序,而对于开发使用 NODE_ENV=development node myapp.js。 当然,如果您的机器已经设置了这些环境变量(例如在 .bash_profile 中),您不需要在命令前加上它们。

    作为一种实践,在开发机器中,您已经在机器上设置了这些变量,而生产机器(例如 docker 容器等)开始干净,并在启动应用程序时传递环境变量。 例如,Heroku(和其他部署服务)允许您设置在机器启动时设置的环境变量。

    还有将变量存储在文件(例如 .env 或其他文件)中的方法,但是您必须在应用程序启动时从磁盘读取这些变量。 这就是dotenv(和config 包)发挥作用的地方。 dotenv 的作用是读取存储在应用程序执行路径(应用程序的根目录)中的 .env 文件,并将其中定义的任何变量设置为 process.env 以供 Node.JS 使用。 这对于开发机器非常有用,但在生产环境中,建议不要将敏感信息存储在变量中的文件,而是使用系统环境变量。 对于生产机器,还可以选择在机器设置时将.env 文件构建或加载到机器的应用程序目录中。

    注意:

    • 切勿将 .env 或存储密码和敏感信息的配置文件提交到您的存储库
    • 切勿将 developmentproduction 变量存储在同一个文件中

    dotenv 方法

    最好的方法是使用dotenv,并拥有不同的.env 文件,一个在您的开发机器上,一个在您的生产机器上。这样,当您的应用程序启动时,它会读取存储在相邻.env 中的变量。这是最安全可靠的方式,因为无法从机器管理应用程序/界面将环境变量传递给生产机器。

    使用dotenv 设置应用程序的最简单方法是将start 命令设置为:

    "start": "nodemon --exec \"node -r dotenv/config\" server.js"
    

    然后在存储在本地/开发机器上的 .env 文件中,您将拥有类似于以下内容的内容:

    DATABASE_PASSWORD=1235
    DATABASE_USERNAME=joe-dev
    ...
    

    在您的生产机器(服务器)上的.env 文件中:

    DATABASE_PASSWORD=root@1235
    DATABASE_USERNAME=root
    ...
    

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 2023-01-30
      • 2021-08-14
      • 2017-06-25
      • 1970-01-01
      • 2020-02-17
      • 2020-10-16
      • 2020-11-30
      相关资源
      最近更新 更多