dotenv文件未加载环境变量

Zam*_*age 15 javascript node.js dotenv

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

NODE_ENV=development
NODE_HOST=localhost
NODE_PORT=4000
NODE_HTTPS=false
DB_HOST=localhost
DB_USERNAME=user
DB_PASSWORD=user
Run Code Online (Sandbox Code Playgroud)

server.jsroot/app/config/server.js文件夹中存档.第一行server.js文件是

require('dotenv').config();

我也试过以下:

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

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

但是,当我server.js命令提示符运行该文件时,我的env变量未加载

node root/app/config/server.js

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

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

Dav*_*idP 42

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

const path = require('path')
require('dotenv').config({ path: path.resolve(__dirname, '../.env') })
Run Code Online (Sandbox Code Playgroud)

简单地做require('dotenv').config({path:__dirname+'/./../../.env'})导致一个位置解析为/some/path/to/env/./../../.env

  • @Goran_Ilic_Ilke - 假设你的产品具有相同的结构,那么它应该。 (2认同)

小智 30

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

你的问题似乎是执行路径.

  • 如何允许 `.env` 被 `.env.local` 覆盖? (4认同)
  • 那是行不通的。您将绝对路径和相对路径混合在一起。您应该改用 Path.Join。 (3认同)
  • @ZammyPage没有理由为什么组合绝对路径和相对路径不起作用(如果他们将前导斜杠添加到env文件的相对路径它必须工作) (2认同)
  • **require('dotenv').config({ path: \`${__dirname}/../../config.env\` })** 使用反引号看起来很干净 (2认同)

Sas*_*chi 20

这是一个单行解决方案:

require('dotenv').config({ path: require('find-config')('.env') })
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用这个名为ckey 的模块,灵感来自上面的 one-liner。

.env 文件来自主目录。

# dotenv sample content
USER=sample@gmail.com
PASSWORD=iampassword123
API_KEY=1234567890
Run Code Online (Sandbox Code Playgroud)

来自子目录的一些js文件

const ck = require('ckey');

const userName = ck.USER;     // sample@gmail.com
const password = ck.PASSWORD; // iampassword123
const apiKey   = ck.API_KEY;  // 1234567890
Run Code Online (Sandbox Code Playgroud)

  • 当我收到错误:找不到模块“find-config”时,您是否需要 npm install find-config? (2认同)

Dig*_*lit 19

@DavidP 的答案中的评论之一记录了 dotenv.config 的输出

console.log(require("dotenv").config())
Run Code Online (Sandbox Code Playgroud)

这将输出配置日志并显示错误。就我而言,它表明 config 方法正在引用当前目录,而不是包含我的 .env 文件的父目录。我可以通过以下内容进行参考

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


dnh*_*yde 10

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

# dotenv sample content

# correct assignment
USER=sample@gmail.com

# wrong assignment (will not load env var)
USER : sample@gmail.com
Run Code Online (Sandbox Code Playgroud)


Ark*_*Tun 10

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

\n

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

\n
.\n\xe2\x94\x9c\xe2\x94\x80 src\n\xe2\x94\x82  \xe2\x94\x94\xe2\x94\x80 index.ts\n\xe2\x94\x94\xe2\x94\x80 .env\n
Run Code Online (Sandbox Code Playgroud)\n
.\n\xe2\x94\x9c\xe2\x94\x80 src\n\xe2\x94\x82  \xe2\x94\x94\xe2\x94\x80 index.ts\n\xe2\x94\x94\xe2\x94\x80 .env\n
Run Code Online (Sandbox Code Playgroud)\n


zer*_*ool 9

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

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

  • AFAIK, dotenv 仅采用绝对路径并注意相对路径。 (5认同)
  • 你是对的..但路径是相对于进程运行的位置,而不是调用 dotenv 的文件。这就是我调试它时发生的情况。 (2认同)

Gre*_*ner 7

我遇到了这个问题,结果证明 REACT 只加载以 REACT_APP_ 为前缀的变量

VueJs 可能有类似的问题,因为它期望变量以:VUE_APP_ 为前缀


小智 7

您可以首先使用以下方法进行调试:

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

在我的场景中,我的.env文件位于根目录中,我需要在嵌套目录中使用它。结果给了我:

{
  parsed: {
    DATABASE_URL: 'mongodb://localhost/vidly',
    PORT: '8080'
  }
}
Run Code Online (Sandbox Code Playgroud)

所以我简单地解析结果并将其存储在一个变量中:

{
  parsed: {
    DATABASE_URL: 'mongodb://localhost/vidly',
    PORT: '8080'
  }
}
Run Code Online (Sandbox Code Playgroud)

然后像 JS 对象一样访问我的 DATABASE_URL:

const dotenv = require('dotenv').config().parsed;
Run Code Online (Sandbox Code Playgroud)


小智 6

这为我解决了这个问题:

const path = require('path');
require('dotenv').config({
  path: path.resolve('config.env'),
});
Run Code Online (Sandbox Code Playgroud)


小智 6

尝试这个:

const dotenv = require('dotenv');
dotenv.config({ path: process.cwd() + '/config/config.env' });
Run Code Online (Sandbox Code Playgroud)

为我工作我不知道怎么样?


thi*_*iro 5

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

事实证明,我正在从我的 user/ 目录运行我的应用程序nodemon application_name/.,这使得 dotenv 在我的主目录而不是应用程序的目录中查找 .env 文件。我很懒,跳过了一个cd,这花了我几分钟的时间。


Kha*_*eby 5

  const path = require('path');
  const dotenv = require('dotenv');
  dotenv.config({ path: path.resolve(__dirname, '../config.env') })
Run Code Online (Sandbox Code Playgroud)

  • 通过添加更多有关代码的作用以及它如何帮助操作员的信息,可以改进您的答案。 (4认同)

小智 5

debug: true我在配置中找到了一个要发送的选项

dotenv.config({ debug: true });
Run Code Online (Sandbox Code Playgroud)

这向我展示了以下内容:

[dotenv][DEBUG] "PORT" is already defined in `process.env` and was NOT overwritten
Run Code Online (Sandbox Code Playgroud)

我添加overwrite: true并让它工作:

[dotenv][DEBUG] "PORT" is already defined in `process.env` and WAS overwritten
Run Code Online (Sandbox Code Playgroud)

我知道我可能回答得太晚了,但在检查文档几个小时后决定分享我的发现。