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.js
或server.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()
创建相对路径。
我在 根文件夹 文件
中有 .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.js
或server.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()
创建相对路径。