为啥我的自定义 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 startnodemon 都返回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 startnodemon 一起使用 另外,当在 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. 文件。 这就是为什么在 env.js 我用path: './dev.env'config 中设置路径。我可能做错了,但根据文档,如果不使用.env,这是声明文件的正确方法。

以上是关于为啥我的自定义 process.env 在 dotenv 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

nodejs中的自定义mysql函数返回未定义

为啥 process.env 返回一个空对象,而 process.env.prop 返回 prop 值?

如何在玩笑中将 process.env 设置为未定义

Heroku process.env undefined

节点 process.env.VARIABLE_NAME 返回未定义

process.env 在 webpack 之前未定义