node.js - node js express项目如何添加环境变量

标签 node.js express

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

  1. 环境发展
  2. 环境生产

在我的 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。我怎样才能做到这一点?

最佳答案

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

Node.JS 中的环境变量

但是,Node.JS 默认情况下不会这样做,您必须设置您的应用程序来处理环境变量。

在 Node.JS 中,您可以通过 shell 命令传递变量,例如: MY_VARIABLE=x node myapp.js (通过在命令前加上变量),这会给你 process.env.MY_VARIABLE在你的里面 myapp.js应用。 遵循此行为,就使用 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或将密码和敏感信息存储到您的存储库的配置文件
  • 永远不要将开发生产变量存储在同一个文件中

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
...

关于node.js - node js express项目如何添加环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54141567/

相关文章:

javascript - 在 express js 中发送后无法设置标题

node.js - ejs包含功能找不到带有html扩展名的模板

Node.js:带有 CNAME 记录的 url 路由

node.js - 服务器端的 Mongoose 分页

javascript - 将参数传递给 promise 。我必须打破链条吗?

mysql - 迁移后如何向模式添加新属性?

ruby-on-rails - Webpacker 需要 Node.js >= v6.4 并且您正在使用 v5.4.0

ajax - Node JS - Express - Mongo DB : posting data with extra square brackets in JSON key

node.js - 当模拟 es6 类时,Jest 无法读取未定义的属性 'instances'

angularjs - 如何将倒计时器同步给所有用户