【问题标题】:dotenv file is not loading environment variablesdotenv 文件未加载环境变量
【发布时间】:2017-07-09 04:03:09
【问题描述】:

我在 根文件夹中有 .env 文件 文件

NODE_ENV=development
NODE_HOST=localhost
NODE_PORT=4000
NODE_HTTPS=false
DB_HOST=localhost
DB_USERNAME=user
DB_PASSWORD=user

还有server.js 文件在root/app/config/server.js 文件夹中。 server.js文件的第一行是

require('dotenv').config();

我也尝试了以下方法:

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

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

但是,当我运行 server.js 文件时,我的环境变量没有加载 从命令提示符

node root/app/config/server.js

如果我使用 visual studio 并按 F5,它会加载!!

我不确定我做错了什么,我错过了什么。 任何建议都非常感谢。谢谢。

【问题讨论】:

  • 当前工作目录可能对您有所提示。
  • 嗨@zerkms,不确定我是否关注你。
  • 好的。 ../.env 是什么?这是一个相对路径。那是相对于……什么?
  • 或者您可以使用绝对路径而不依赖于当前工作目录值:nodejs.org/docs/latest/api/globals.html#globals_dirname
  • 除非你的情况不是require

标签: javascript node.js dotenv


【解决方案1】:

require('dotenv').config({path:__dirname+'/./../../.env'})怎么样?

您的问题似乎是执行路径。

【讨论】:

  • 这行不通。您将绝对路径和相对路径混合在一起。您应该改用 Path.Join。
  • @ZammyPage 没有理由将绝对路径和相对路径结合起来不起作用(如果他们将前导斜杠添加到 env 文件的相对路径,它必须起作用)
  • 对不起,我忘记了前导斜杠 :(。我在我的服务上使用了 dotenv。它不起作用?
  • require('dotenv').config({ path: `${__dirname}/../../config.env` }) 使用反引号会看起来很干净
  • 如何让.env.env.local 覆盖?
【解决方案2】:

这解决了我在 Node v8.14.1 中的问题:

const path = require('path')
require('dotenv').config({ path: path.resolve(__dirname, '../.env') })

只需执行require('dotenv').config({path:__dirname+'/./../../.env'}) 就会得到一个解析为/some/path/to/env/./../../.env 的位置

【讨论】:

  • 感谢您的解决方案,它对我有用。就我而言,我在 Controller 文件夹中创建了一个文件并尝试输出 require('dotenv').config() --> 它显示的是“c:\users\..\controller\.env”。真的很奇怪,为什么它引用控制器文件夹而不是根路径。但是当尝试使用绝对路径(仅用于临时解决方法)时,它起作用了。
  • @ashishsarkar - 你的路径字符串是什么样的?在您的 config 方法中?
  • @DavidP 终于可行的解决方案,这种方法在生产中也适用吗?
  • @Goran_Ilic_Ilke - 假设您的产品具有相同的结构,那么它应该。
【解决方案3】:

这是一个单行解决方案:

require('dotenv').config({ path: require('find-config')('.env') })

这将递归父目录,直到找到要使用的 .env 文件。

您也可以选择使用这个名为 ckey 的模块,该模块的灵感来自上面的单线。

.env 来自主目录的文件。

# dotenv sample content
USER=sample@gmail.com
PASSWORD=iampassword123
API_KEY=1234567890

子目录下的一些js文件

const ck = require('ckey');

const userName = ck.USER;     // sample@gmail.com
const password = ck.PASSWORD; // iampassword123
const apiKey   = ck.API_KEY;  // 1234567890

【讨论】:

    【解决方案4】:

    如果您从嵌套文件中调用 dotenv,并且您的 .env 文件位于项目根目录,则您希望通过以下方式连接点:

    require('dotenv').config({path:'relative/path/to/your/.env'})
    

    【讨论】:

    • AFAIK,dotenv 只采用绝对路径并记下相对路径。
    • 你是对的..但路径是相对于进程运行的位置,而不是调用 dotenv 的文件。这就是我调试时发生的情况。
    • 这解决了我的“未定义”.env 变量问题。我什至还有另一个项目运行与配置服务器和 dotenv 的完全相同的设置,并且如果不明确定义路径就无法使其工作。
    • 上面哪个“答案”?
    • 答案太多了,我现在还不确定。我将更新文本以反映这是一个潜在的解决方案。它适用于在这里发表评论的人。
    【解决方案5】:

    我遇到过这个问题,结果发现 REACT 只加载前缀为 REACT_APP_ 的变量

    VueJs 可能会遇到类似的问题,因为它希望变量前缀为:VUE_APP_

    【讨论】:

    • 哇!很好的收获
    【解决方案6】:

    在您到达这一点之前的远程情况下,我的问题非常愚蠢: 我错误地用冒号“:”而不是等于“=”命名了我的环境变量。菜鸟错误,但结果行为未加载拼写错误的变量赋值。

    # dotenv sample content
    
    # correct assignment
    USER=sample@gmail.com
    
    # wrong assignment (will not load env var)
    USER : sample@gmail.com
    

    【讨论】:

    • 我也做了同样的事情。从 JSON 对象复制并忘记格式化。感谢您将我从另外 2 个小时的头疼中解救出来
    【解决方案7】:

    @DavidP 的回答中的一个 cmets 记录了 dotenv.config 的输出

    console.log(require("dotenv").config())
    

    这将输出配置日志并显示错误。在我的情况下,它表明配置方法正在引用当前目录而不是 包含我的 .env 文件的父目录。我可以通过以下方式引用它

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

    【讨论】:

      【解决方案8】:

      试试这个:

      const dotenv = require('dotenv');
      dotenv.config({ path: process.cwd() + '/config/config.env' });
      

      如何为我工作??

      【讨论】:

        【解决方案9】:

        这为我解决了这个问题:

        const path = require('path');
        require('dotenv').config({
          path: path.resolve('config.env'),
        });
        

        【讨论】:

          【解决方案10】:

          确保在入口文件的开头加载.env(例如index.jsserver.js)。有时,执行顺序会在服务启动后加载环境变量。而且,通过使用__dirname,它可以很容易地指向相对于当前文件所需的文件。

          这里我的项目结构是这样的。

          .
          ├─ src
          │  └─ index.ts
          └─ .env
          
          // index.ts
          import dotenv from 'dotenv';
          import path from 'path';
          
          dotenv.config({path: path.join(__dirname, '..', '.env')});
          
          ...
          

          【讨论】:

            【解决方案11】:

            您可以先使用console.log(require('dotenv').config()) 进行调试。 在我的场景中,我的 .env 文件位于根目录中,我需要在嵌套目录中使用它。结果给了我{ parsed: { DATABASE_URL: 'mongodb://localhost/vidly', PORT: '8080' } }。所以我只是解析结果并将其存储在变量const dotenv = require('dotenv').config().parsed; 中。然后像 JS 对象一样访问我的 DATABASE_URL:dotenv.DATABASE_URL

            【讨论】:

              【解决方案12】:

              有一次我遇到了同样的问题。 Dotenv 没有加载 .env 文件。我尝试使用路径配置解决此问题,将 .env 文件放在根文件夹中,将 .env 放在文件正在运行的文件夹中,但没有任何帮助。然后我只是删除了 Node_modules 文件夹,重新安装了所有依赖项,它工作正常

              【讨论】:

                【解决方案13】:

                在我的情况下,.env 读得很好,但不是.env.local

                package.json 更新为将.env 命名为.env.localcp ./.env.local .env)解决了这个问题:

                  "myscript": "cp ./.env.local .env && node ./scripts/myscript.js"
                

                【讨论】:

                  【解决方案14】:

                  这让我有些头疼,将 require 语句的输出记录到控制台的提示真的很有帮助。 console.log(require('dotenv').config());

                  原来我正在使用 nodemon application_name/. 从我的用户/目录运行我的应用程序,这使得 dotenv 在我的主目录而不是应用程序的目录中查找 .env 文件。我懒得跳过一个cd,这花了我几分钟的时间。 自我注意:为 cd 创建一个别名到应用程序的目录并运行它

                  【讨论】:

                    【解决方案15】:

                    我遇到了同样的问题,这就是我的工作代码最终的样子。 我将 .env 文件放在单独的配置文件夹中

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

                    【讨论】:

                      【解决方案16】:

                      只需添加

                      require("dotenv").config();

                      到您的应用程序的索引,它将找到您的 .env 文件,然后您可以在代码中的任何位置使用 process.env.YOUR_ENV

                      【讨论】:

                        猜你喜欢
                        • 2015-09-02
                        • 1970-01-01
                        • 2018-05-11
                        • 2021-11-08
                        • 2020-01-22
                        • 1970-01-01
                        • 2014-02-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多