NodeJS 节点进程,env.VARIABLE_NAME返回未定义

kpbwa7wx  于 2023-04-29  发布在  Node.js
关注(0)|答案(8)|浏览(235)

我在我的mac上使用环境变量来存储一些敏感的凭据,并试图通过Node访问它们。我将它们添加到我的环境配置文件中
export VARIABLE_NAME=mySensitiveInfo
当我使用echo $VARIABLE_NAME时,我收到了正确的输出(我的敏感信息)。
然而,当我试图用process.env.VARIABLE_NAME访问Node中的这个变量并试图在控制台上打印出来时,我得到了一个undefined。
其他的环境变量看起来都没问题。例如,当I console.log(process.env.FACEBOOK_CALLBACK_URL)时,它会将正确的值打印到我的控制台。我前几天添加了FACEBOOK_CALLBACK_URL
我需要重新启动我的机器或其他东西吗?环境变量在Node中可用需要一定的时间吗?我在SO上看到的最接近的答案是this post,但没有人能够弄清楚为什么会发生这种情况。

xmjla07d

xmjla07d1#

nodemon.json文件仅用于设置nodemon特定的配置,因此可以使用dotenv包来创建自定义环境变量
首先,安装dotenv包

npm install dotenv --save

之后创建。root文件中的env文件,并将环境变量包括为波纹管

MONGO_ATLAS_PW=xxxxx
JWT_KEY=secret

最后,在app.js文件中,在导入之后插入。

require('dotenv').config()

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

process.env.MONGO_ATLAS_PW
process.env.JWT_KEY
hmae6n7t

hmae6n7t2#

process.env.VARIABLE_NAME返回undefined,因为节点。js执行环境还不知道新添加的VARIABLE_NAME。为了解决这个问题,节点。js执行环境(e.IDE)需要重新启动。
以下步骤可用于重现此问题:
1.打开IDE(如WebStorm)并编写一个简单的Node。js程序:console.log(process.env.VARIABLE_NAME) .它将按预期打印undefined,因为VARIABLE_NAME尚未定义。保持IDE运行,不要关闭它。
1.打开环境配置文件,如.bash_profile,并在其中添加export VARIABLE_NAME=mySensitiveInfo
1.打开系统控制台,运行source .bash_profile,执行上面的export语句。从现在开始,只要打开系统控制台,就会存在VARIABLE_NAME环境变量。
1.在系统控制台中,执行Node。js程序在步骤1中,它将打印mySensitiveInfo
1.切换到IDE并执行Node。js程序,它将打印undefined
1.重新启动IDE并执行Node。js程序,这次会打印mySensitiveInfo

8aqjt8rx

8aqjt8rx3#

我刚才遇到了一个问题,我用这个在webpack配置中解决了

const plugins = [
    new webpack.NoEmitOnErrorsPlugin(),
    // after compile global will defined `process.env` this Object
    new webpack.DefinePlugin({
      BUILD_AT : Date.now().toString(32),
      DEBUG: process.env.NODE_ENV !== 'production',
          'process.env': {
              'NODE_ENV': JSON.stringify(process.env.NODE_ENV || "development"),
              'VARIABLE_NAME': JSON.stringify(process.env.VARIABLE_NAME)
     }
   })
]
b1zrtrql

b1zrtrql4#

对于将来可能遇到这个问题并且上面的解决方案都不起作用的每个人来说,这也可能是因为您正在子文件夹或子目录中运行node <filename>.js,并且由于您的.env文件位于根文件夹中,因此processs.env.<variable>将始终返回undefined。
一个简单的检查方法是尝试下面的代码👉

const test = require('dotenv').config()
console.log(test)

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

{   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'   } }

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

mf98qq94

mf98qq945#

请检查的目录。env文件,如果它与您的应用程序在同一个文件中。js或(abc.js)than move。env向上一级

5uzkadbs

5uzkadbs6#

对于任何陷入React的人。
article帮助我理解。React中的env:
变量必须具有前缀“REACT_APP_”,否则变量将无法正常工作。
在.env文件中,它应该看起来像这样:

REACT_APP_YOUR_VARIABLE_NAME=SOMETHING

这(我有什么,并给未定义):

MY_VARIABLE_NAME=SOMETHING
qxsslcnc

qxsslcnc7#

关闭代码Runner或IDE环境一次,然后重新打开它。如果使用VS代码,请将其完全关闭。(或CMD或Power Shell或。..)

xurqigkl

xurqigkl8#

我也有同样的问题。在我的例子中是env文件和db。js在子文件夹configs中。
在index/server中。js,在导入dotven时,我使用了

require('dotenv').config({path: './configs/.env'});

这样我的env变量就被访问了。
希望我的这个例子对你有帮助!😀

相关问题