Dotenv 文件没有加载环境变量

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

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

以及 root/app/config/server.js文件夹中的 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

如果我使用 视觉工作室和按 F5,它加载! !

我不知道我做错了什么,我错过了什么。 非常感谢你的建议,谢谢。

237715 次浏览

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

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

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

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

这里有一个单行解决方案:

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

这将循环访问父目录,直到找到要使用的. env 文件。

您也可以选择使用这个模块 < strong > 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

这解决了我在 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的位置

有一次我遇到了同样的问题。Dotenv 没有装子弹。Env 文件。我试图用一个路径配置来解决这个问题。将 env 文件放在根文件夹中。运行文件的文件夹中的 env,没有任何帮助。然后,我只是垃圾节点 _ 模块文件夹,重新安装所有的依赖项,它的工作正常

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

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

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

我遇到过这个问题,结果是 REACT 只加载前缀为 REACT _ APP _ 的变量

VueJs 可能会有类似的问题,因为它期望变量以: VUE _ APP _ 作为前缀

在你到达这里之前的远程案例中,我的问题相当愚蠢: 我错误地将 env 变量命名为冒号“ :”而不是等于“ =”。新手的错误,但由此产生的行为没有加载拼写错误的变量赋值。

# dotenv sample content


# correct assignment
USER=sample@gmail.com


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

这解决了我的问题:

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

试试这个:

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

为我工作,我怎么做到的?

@ DavidP 答案中的一条注释记录 dotenv.config 的输出

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

这将输出配置和显示错误的日志。在我的例子中,它表明 config 方法引用的是工作目录,而不是 父目录,其中包含我的. env 文件

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

确保在条目文件的开头加载 .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')});


...

您可以首先使用 console.log(require('dotenv').config())进行调试。 在我的剧本里。Env 文件在根目录中,我需要在嵌套目录中使用它。结果是 { parsed: { DATABASE_URL: 'mongodb://localhost/vidly', PORT: '8080' } }。因此,我只是解析结果并将其存储在一个变量 const dotenv = require('dotenv').config().parsed;中。然后像 JS 对象 dotenv.DATABASE_URL那样访问我的 DATABASE _ URL

我花了一些心思,记录到控制台的 request 语句的输出的提示非常有帮助。console.log(require('dotenv').config());

原来我是在用 nodemon application_name/.从用户/目录运行我的应用程序,这使得 dotenv 寻找。而不是应用程序的 env 文件。我懒得跳过一个 cd,这花了我几分钟的时间。

您可能需要。相对于启动应用程序的当前工作目录的 env 文件。 你可以创建这样的路径:

const path = require('path')
require('dotenv').config({path: path.relative(process.cwd(), path.join(__dirname,'.env'))});

返回工作目录的绝对路径。
__dirname返回应用程序的绝对路径。
path.join()添加。Env-file 到应用程序的路径。所以如果你。Env 文件嵌套得更深,只需添加文件夹(例如 path.join(__dirname, 'config', 'secret','.env'))
path.relative()创建相对路径。

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

如果您正在使用其他工具(全局安装)来调用您的配置文件,请仅使用绝对路径..。

require('dotenv').config({
path: '/path/to/my/project/.env',
});

我犯了一个愚蠢的错误,我用冒号“ :”代替“ =”

我用下面

用户: 根

但它应该是

USER = root

我正在使用:

import findUp from 'find-up';
dotenv.config({ path: findUp.sync('.env') });

如果没有什么可以帮助您将.env 放在 src 文件夹之外,如果您的文件夹结构类似于

-src/
- index.js
- env.js (where you call dotenv.config)
// you may call dotenv.config anywhere but entry point is best.


.env (file outside the src folder)

我在配置中发现了一个选项 debug: true,它向我显示了以下内容:

[dotenv][DEBUG] "PORT" is already defined in `process.env` and was NOT overwritten

我添加了 overwrite: true并使其工作:

[dotenv][DEBUG] "PORT" is already defined in `process.env` and WAS overwritten

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

如果 config.env 文件和 index.js 文件都出现在同一个目录中: enter image description here

然后,文件: index.js

const path = require('path');


//  Set port from environment variables
dotenv.config({path: 'config.env'})
const PORT = process.env.PORT || 8080

文件: config.env:

PORT = 4000