dotenv 文件未加载环境变量

dotenv file is not loading environment variables

我在 根文件夹 文件

中有 .env 文件
NODE_ENV=development
NODE_HOST=localhost
NODE_PORT=4000
NODE_HTTPS=false
DB_HOST=localhost
DB_USERNAME=user
DB_PASSWORD=user

server.js文件夹中的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,它会加载!!

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

使用 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 文件。

您也可以选择使用这个名为 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 放在文件 运行 所在的文件夹中,但没有任何帮助。然后我只是删除了 Node_modules 文件夹,重新安装所有依赖项并且它工作正常

在我的例子中 .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_

在你到达这里的远程情况下,我的问题是相当愚蠢的: 我错误地将我的环境变量命名为冒号“:”而不是等号“=”。菜鸟错误,但结果行为并未加载拼写错误的变量赋值。

# 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())

这将输出配置日志并显示错误。在我的例子中,它表明配置方法引用的是当前目录而不是 包含我的 .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 对象一样访问我的 DATABASE_URL:dotenv.DATABASE_URL

这让我有些头疼,将 require 语句的输出记录到控制台的提示真的很有帮助。 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'))});

process.cwd() returns 工作目录的绝对路径。
__dirname returns 应用程序的绝对路径。
path.join() 将 .env-file 的路径添加到应用程序的路径中。因此,如果您的 .env 文件嵌套得更深,只需添加文件夹(例如 path.join(__dirname, 'config', 'secret','.env')
path.relative() 创建相对路径。