为啥我的自定义 process.env 在 dotenv 中不起作用?
Posted
技术标签:
【中文标题】为啥我的自定义 process.env 在 dotenv 中不起作用?【英文标题】:Why are my custom process.env not working within dotenv?为什么我的自定义 process.env 在 dotenv 中不起作用? 【发布时间】:2019-12-04 09:25:34 【问题描述】:了解到包含 API 密钥是一种不好的做法,我进行了一些研究并尝试了解如何创建自定义 process.env
。
看完后:
Node.js Everywhere with Environment Variables! How to set NODE_ENV to production/development in OS X How to set process.env from the file in NodeJS? dotenv file is not loading environment variables我正在尝试根据process.env.NODE_ENV
在本地设置一个环境文件。该应用程序将托管在 Heroku 上,在我的 .gitignore 中我有dev.env
,但是当我尝试在本地使用dotenv
时,我得到一个undefined
。我已在终端中使用export NODE_ENV=development
在本地设置环境。当我运行命令npm start
或nodemon
都返回undefined
但在 env.js 我得到Testing for: development
,例如:
nodemon
[nodemon] 1.19.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node app.js`
Testing for: development
undefined
这是我所拥有的:
app.js:
const keys = require('./config/env')
return console.log(process.env.PORT)
config/env.js:
const env = process.env.NODE_ENV
console.log(`Testing for: $env`)
try
switch(env)
case 'undefined':
Error('Environment undefined, if local in terminal: export NODE_ENV=development')
break
case 'development':
require('dotenv').config(
path: './dev.env'
)
break
case 'production':
require('dotenv').config(
path: './prod.env'
)
break
default:
Error('Unrecognized Environment')
catch (err)
Error('Error trying to run file')
config/dev.env:
## Port number to run Application
PORT=4321
但是在 app.js 中,当我使用 return console.log(process.env.PORT)
或 return console.log(keys.PORT)
进行测试时,它们都记录了 undefined
,为什么?使用dotenv
时,我似乎在 env.js 中做错了什么。
澄清一下,我什至还没有推送到 Heroku,prod.env 将是验证。如果有更好的方法请不吝赐教。
【问题讨论】:
你确定你正在运行带有“NODE_ENV=development node src/main.js”的节点服务器 我正在运行 nodemon 并在 app.js 中调用 console.log。调用 env.js 并记录 NODE_ENV 时,我得到了“开发”日志 我认为你应该像这样运行脚本:NODE_ENV=development nodemon main.js @d337 我的理解是,如果设置了export NODE_ENV=development
,那么它应该与npm start
或nodemon
一起使用
另外,当在 app.js 中执行 console.log(process.env.NODE_ENV)
时,终端会返回 development。
【参考方案1】:
在重新阅读有关path
的文档后,我发现了哪里出了问题,例如:
require('dotenv').config( path: '/full/custom/path/to/your/env/vars' )
更改后:
case 'development':
require('dotenv').config(
path: './dev.env'
)
break
到:
case 'development':
require('dotenv').config(
path: `$__dirname/dev.env`
)
break
它有效。所以我的错误是范围问题。无需设置const keys
,因此只需使用require('./config/env')
,我就可以访问任何自定义进程,例如:
process.env.CUSTOM
或者在这种情况下是:
process.env.PORT
来自 app.js
【讨论】:
供将来参考,如果 dotenv 找不到或无法读取您使用path
选项指定的文件,它将返回错误。我们会显示错误以帮助进行此类调试。【参考方案2】:
Heroku 不在 dotenv 上运行。
在给定 Heroku 应用的设置页面中有一个叫做“Config Vars”的东西:
例如
对于您的示例,如果代码要访问:process.env.NODE_ENV
,您可以在给定应用的 Heroku 设置页面中设置一个新的 Config Var,并将其命名为 NODE_ENV
。设置所需的值,然后按保存。瞧。完成。
dotenv 的附加价值通常用于在本地机器上进行测试。
【讨论】:
【参考方案3】:您好,首先使用switch(env.trim())
,然后更改路径值path: './config/dev.env'
。祝你好运。
【讨论】:
【参考方案4】:您收到此错误是因为您需要设置这些环境变量,因为我们那里没有 .env 文件,而在开发服务器 dotenv 上使用您的 .env 文件为您设置。
您需要通过 Web 界面或 heroku CLI 设置这些变量。 Thisheroku doc 会帮助你。
【讨论】:
我知道如何在 CLI 中设置问题是在开发中使用自定义流程。认为你误解了这个问题。我可以记录 NODE_ENV,所以错误是从 env.js 到 dotenv。 正如我所看到的,config()
将路径指向名为 .env 的文件所在的目录。所以这是一个问题。我们所做的是在构建之前将 .env 替换为 .env.path: './dev.env'
在config
中设置路径。我可能做错了,但根据文档,如果不使用.env
,这是声明文件的正确方法。以上是关于为啥我的自定义 process.env 在 dotenv 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 process.env 返回一个空对象,而 process.env.prop 返回 prop 值?