节点process.env.VARIABLE_NAME返回undefined

Yu *_*hen 18 environment-variables node.js

我在我的mac上使用环境变量来存储一些敏感的凭据,并尝试通过Node访问它们.我将它们添加到我的环境配置文件中

export VARIABLE_NAME=mySensitiveInfo

当我使用时,echo $VARIABLE_NAME我收到正确的输出(我的敏感信息).

但是,当我尝试在Node中访问这个相同的变量process.env.VARIABLE_NAME并尝试在控制台上打印出来时,我得到一个未定义的.

其他环境变量似乎没问题.例如,当我console.log(process.env.FACEBOOK_CALLBACK_URL),它将正确的值打印到我的控制台.我几天前添加了FACEBOOK_CALLBACK_URL.

我是否必须重新启动机器?环境变量在Node中可用之前是否需要一段时间?我在SO上看到的最接近的答案是这篇文章,但没有人能够弄清楚它为什么会发生.

小智 22

对于将来可能遇到此问题并且上述解决方案都不起作用的每个人,也可能是因为您node <filename>.js在子文件夹或子目录中运行,并且由于您的.env文件位于根文件夹中,因此processs.env.<variable>将始终返回未定义。

一个简单的检查方法是尝试以下代码

const test = require('dotenv').config()
console.log(test)
Run Code Online (Sandbox Code Playgroud)

在控制台中我们得到以下错误

{   error: Error: ENOENT: no such file or directory, open 'C:\Users\vxcbv\Desktop\voisascript-auth\model\.env'
      at Object.openSync (node:fs:585:3)
      at Object.readFileSync (node:fs:453:35)
      at Object.config (C:\Users\vxcbv\Desktop\voisascript-auth\node_modules\dotenv\lib\main.js:72:42)
      at Object.<anonymous> (C:\Users\vxcbv\Desktop\voisascript-auth\model\db.js:1:32)
      at Module._compile (node:internal/modules/cjs/loader:1105:14)
      at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
      at Module.load (node:internal/modules/cjs/loader:981:32)
      at Function.Module._load (node:internal/modules/cjs/loader:822:12)
      at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
      at node:internal/main/run_main_module:17:47 {
    errno: -4058,
    syscall: 'open',
    code: 'ENOENT',
    path: 'C:\\Users\\vxcbv\\Desktop\\voisascript-auth\\model\\.env'   } }
Run Code Online (Sandbox Code Playgroud)

强调Error: ENOENT: no such file or directory, open. 要解决此问题,只需导航回根目录并从那里运行文件,但从根目录指定文件的完整路径,例如 node /<subfolder>/<file.js>


sha*_*ncs 19

process.env.VARIABLE_NAME返回,undefined因为Node.js执行环境不知道新添加的VARIABLE_NAME.要解决此问题,需要重新启动Node.js执行环境(例如IDE).

以下步骤可用于重现此问题:

  1. 打开像WebStorm这样的IDE并编写一个简单的Node.js程序:console.log(process.env.VARIABLE_NAME).它将undefined按预期打印,VARIABLE_NAME尚未定义.保持IDE运行,不要关闭它.
  2. 打开环境配置文件,例如.bash_profile并添加export VARIABLE_NAME=mySensitiveInfo它.
  3. 打开系统控制台并运行source .bash_profile,以便export执行上述语句.从现在开始,无论何时打开系统控制台,都VARIABLE_NAME存在环境变量.
  4. 在系统控制台中,执行步骤1中的Node.js程序,它将打印出来mySensitiveInfo.
  5. 切换到IDE并执行Node.js程序,它将打印出来undefined.
  6. 重启IDE并执行Node.js程序,这次它会打印出来 mySensitiveInfo


小智 18

nodemon.json 文件仅用于设置 nodemon 特定的配置,因此对于创建自定义环境变量,我们可以使用 dotenv 包

首先,安装 dotenv 包

npm install dotenv --save
Run Code Online (Sandbox Code Playgroud)

之后在 root 中创建 .env 文件并包含如下环境变量

MONGO_ATLAS_PW=xxxxx
JWT_KEY=secret
Run Code Online (Sandbox Code Playgroud)

最后,在app.js导入后在文件中插入以下内容。

require('dotenv').config()
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用环境变量

process.env.MONGO_ATLAS_PW
process.env.JWT_KEY
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说很直接。谢谢。 (4认同)
  • 注意:-“之后在根目录中创建 .env 文件”意味着您必须在包含 package.json 的同一文件夹中创建 .env 文件。这对我有用:) (2认同)
  • 嗯,非常感谢您的确切答案。奇迹般有效 (2认同)

小智 5

我遇到过同样的问题。就我而言,env 文件和 db.js 位于子文件夹 configs 内。

因此,在 index/server.js 中,在导入 dotven 时,我使用了

require('dotenv').config({path: './configs/.env'});
Run Code Online (Sandbox Code Playgroud)

这样我的环境变量就被访问了。

希望我的这个例子对你有帮助!


小智 5

对于任何陷入 React 的人。

\n

这篇文章帮助我理解了 React 中的 .env:

\n
\n

该变量必须具有 \xe2\x80\x98\xe2\x80\x98REACT_APP_\xe2\x80\x99\xe2\x80\x99 前缀,否则变量将无法正常工作。

\n
\n

在您的 .env 文件中,它应该如下所示:

\n
REACT_APP_YOUR_VARIABLE_NAME=SOMETHING\n
Run Code Online (Sandbox Code Playgroud)\n

不是这个(我拥有并给出未定义的):

\n
MY_VARIABLE_NAME=SOMETHING\n
Run Code Online (Sandbox Code Playgroud)\n