为什么我的自定义 process.env 在 dotenv 中不起作用?

Dᴀʀ*_*ᴅᴇʀ 7 local environment-variables node.js dotenv

了解到包含 API 密钥是一种不好的做法,我已经做了一些研究并尝试学习如何创建自定义process.env.

看完后:

我正在尝试基于 .env 在本地设置一个 env 文件process.env.NODE_ENV。该应用程序将托管在 Heroku 和我的 .gitignore 中,dev.env 但是当我尝试在dotenv本地使用时,我得到了一个.gitignore 文件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
Run Code Online (Sandbox Code Playgroud)

这是我所拥有的:

应用程序.js

const keys = require('./config/env')
return console.log(process.env.PORT)
Run Code Online (Sandbox Code Playgroud)

配置/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')
}
Run Code Online (Sandbox Code Playgroud)

配置/dev.env

## Port number to run Application
PORT=4321
Run Code Online (Sandbox Code Playgroud)

但是在app.js 中,当我使用return console.log(process.env.PORT)return console.log(keys.PORT)它们都记录时undefined,为什么?使用.env时我似乎在env.js 中做错了什么dotenv

澄清一下,我什至还没有推送到 Heroku,prod.env将是验证。如果有更好的方法,请教育我。

Dᴀʀ*_*ᴅᴇʀ 12

重新阅读有关 的文档后,我发现我哪里出错了path,例如:

require('dotenv').config({ path: '/full/custom/path/to/your/env/vars' })
Run Code Online (Sandbox Code Playgroud)

更改后:

case 'development':
  require('dotenv').config({
    path: './dev.env'
  })
  break
Run Code Online (Sandbox Code Playgroud)

到:

case 'development':
  require('dotenv').config({
    path: `${__dirname}/dev.env`
  })
  break
Run Code Online (Sandbox Code Playgroud)

有用。所以我的错误是范围问题。无需设置const keys,只需使用require('./config/env')我就可以访问任何自定义进程,例如:

process.env.CUSTOM
Run Code Online (Sandbox Code Playgroud)

或者在这种情况下,它将是:

process.env.PORT
Run Code Online (Sandbox Code Playgroud)

来自app.js