dotenv 文件未加载环境变量

我在 root folder 文件中有 .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'}) ;

However, my env variable are not loaded when I run the server.js file from **command prompt**

node root/app/config/server.js

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

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

stack overflow dotenv file is not loading environment variables
原文答案
author avatar

接受的答案

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

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


答案:

作者头像

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

作者头像

这是一个单行解决方案:

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
作者头像

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

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

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

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

作者头像

@DavidP's answer notes 中的评论之一记录了 dotenv.config 的输出

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

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

require('dotenv').config({path: '../.env'})
作者头像

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

# dotenv sample content

# correct assignment
USER=sample@gmail.com

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

尝试这个:

const dotenv = require('dotenv');
dotenv.config({ path: process.cwd() + '/config/config.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