我该如何在Node.js中设置dotenv文件?

102

我尝试使用dotenv NPM包,但它对我不起作用。我有一个名为config/config.js的文件,并包含以下内容:

'use strict';
    
var dotenv = require('dotenv');
dotenv.load();
console.log('config');

我在应用程序文件夹的根目录下有另一个文件.env。 我还有一个环境变量 TWILIO_ACCOUNT_SID

使用环境变量来运行特定函数时,我执行以下过程:

$ node
> require('./config/config.js');
config
{}
> process.env.TWILIO_ACCOUNT_SID
undefined

我在我的.env文件中定义了TWILIO_ACCOUNT_SID,但是当我尝试在控制台输出该变量的值时,我会收到一个错误提示,表示该变量未定义。

非常感谢您提供解决此问题的任何支持。


对我来说没问题,在 REPL 和运行脚本时都可以。你使用的是哪个版本的 Node,能否展示一下你的 .env 文件的例子? - Ben Fortune
我在 .env 文件中添加了分号,导致了这个错误。 - Muhammad Tameem Rafay
39个回答

158

在我的情况下,每次我尝试使用 process.env.MY_KEY.env 文件获取密钥时,它都会返回 undefined

我遇到了这个问题两个小时,只是因为我将文件命名为类似于 keys.env 这样的名称,而这不被认为是一个 .env 文件。

所以以下是故障排除清单:

  1. 文件名应为.env(我认为 .env.test 也可以接受)。

  2. 确保在应用程序中尽早使用此语句 require('dotenv').config(); 调用它。

  3. .env 文件应该在你的项目的根目录中。

  4. 遵循“文件写入规则”,例如 DB_HOST=localhost,不需要用双引号/单引号将值包裹起来。

此外,请查看NPM网站上该软件包的文档


9
.env文件移动到项目的根目录后,它起作用了。 - chandan
4
非常感谢您的回复!这正是我的问题。可能会为我和其他人节省两个小时或更多时间。 - Dylan
非常感谢!我刚刚浪费了一个小时进行调试,因为在我的代码编辑器中看起来.env文件在根目录中。但实际上并不是这样的... - Iulius
2
我把我的命名为“twitter.env”,而不仅仅是“.env”。叹气 - thargenediad
是的。在我将文件保存到Windows并重新上传到服务器后,前面的“.”被删除了... - stackers
显示剩余5条评论

71

我是这样解决的:

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

或者使用绝对路径:

C:\\asd\\auhsd\\.env
如果找不到.env文件,它会返回undefined

如果找不到.env文件,它会返回undefined


1
太好了!我需要这个,因为我正在将我的 NodeJS 项目作为服务运行(大致遵循此教程),结果发现在这种情况下服务找不到 .env 文件。指定绝对路径是解决方案!! - morphatic
太好了,谢谢!在容器化环境中使用这个,不确定是否是原因,但如果您正在使用docker并且遇到问题,请尝试使用此修复! - DORRITO

69

节省一些故障排除时间,并记录您的require调用,就像这样:

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

您应该能够看到有关问题更详细信息的错误提示。


13
你可以更进一步,在选项中添加{debug: true}。console.log(require('dotenv').config({debug: true})); - Alex Standiford
1
小心使用 console.log(require('dotenv').config({debug: true}));console.log(require('dotenv').config()),因为它会泄露你所有的秘密。只要它不在日志中停留太久,就还好。否则,你可能会认为这些秘密已经被泄露了。debug 选项只给了我 [dotenv][DEBUG] did not match key and value when parsing line X:[dotenv][DEBUG] "MY_SECRET" is already defined in 'process.env' and will not be overwritten 日志,这些日志的数量是秘密的数量。不确定它是否对我的情况有所帮助,但点赞表示支持新事物 ;) - Daniel Danielecki

24

最近遇到了相同的问题。请检查您的.env文件,并使用等于号而非冒号。以下是一个示例:

key=value

改为:

key:value

太棒了!我之前犯了这个错误。 - CandleCoder
太棒了!!!我在调试三个小时后找到了正确答案。 - jithu
这是基本问题! - Alok Rajasukumaran

15

我也遇到过同样的问题。我发现我的文件以某种方式编码为UCS-2 BE BOM。将我的.env文件转换为UTF-8解决了这个问题(例如,您可以使用Notepad++轻松完成此操作)。


5
你拯救了我的一天!我在 powershell 脚本中使用 echo 命令通过 TFS 生成 .env 文件,但文件被保存为 UCS-2 编码。现在我确保 powershell 将其保存为 utf-8 编码,一切都正常工作了! - Alfred Brockötter
1
你是我的英雄!这也是我的问题! - Phil

8
确保变量未被设置。 Dotenv不会覆盖它们。 如果变量已经设定,那么您需要将其删除。在PowerShell中,可以使用以下命令 - 如此提到:
Remove-Item Env:\MyTestVariable

1
谢谢!这就是我的问题。由于某种原因,我在shell中定义了我的环境变量为DATABASE_URL=,但是忘记了它。它根本没有出现在我的process.env中,包括空字符串 - 真的很烦人!取消设置unset DATABASE_URL后,我的.env文件被正确读取了。 - Brian Peterson
很高兴你告诉我它有所帮助 :) - korteee
+2 对你来说真是太棒了,如果我能的话。 - Mariusz

8

我没有按照dotenv模块文档中的正确格式设置环境变量,例如我之前是这样设置的:export TWILIO_CALLER_ID="+wwehehe",因此dotenv模块无法正确解析我的文件。当我发现这个问题后,我将声明中的export关键字删除后,一切正常工作。


8

我也遇到了同样的问题,用了4个小时才找到了错误。在我的情况下,问题很奇怪。

当我试着运行 "node app.js" 时,它可以工作。但是当我想要它以守护进程的方式启动时,却不能正常工作。

我是如何解决这个问题的呢? 我替换了:

var dotenv = require('dotenv');
dotenv.load();

使用:

var dotenv = require('dotenv').config({path: path.join(__dirname, '.env')})

3
不要使用__dirname,而是使用process.env.PWD。这样做可以达到相同的效果。 - jofftiquez

8

我曾经遇到过一个问题,即.env变量无法加载并且出现了undefined的情况。

我尝试了以下方法:

index.js:

import dotenv from 'dotenv';
dotenv.config();
import models from './models';

models.js

import Sequelize from 'sequelize';
const sequelize = new Sequelize(
    process.env.DATABASE,
    process.env.DATABASE_USER,
    process.env.DATABASE_PASSWORD,
    {
        dialect: 'postgres',
    }
);

显然,由于在nodejs中加载导入的方式,index.js中对模型的导入导致了在dotenv.config()之前执行了models.js。因此,我从process.env得到了未定义的值。

当我将models.js更改为像这样进行dotenv配置时:

import Sequelize from 'sequelize';
import dotenv from 'dotenv';
dotenv.config();
const sequelize = new Sequelize(
    process.env.DATABASE,
    process.env.DATABASE_USER,
    process.env.DATABASE_PASSWORD,
    {
        dialect: 'postgres',
    }
);

它开始工作了!


7

请确保你从根目录中执行Node脚本。

例如,我在名为./bin/test.js的子文件夹中使用测试脚本。 像这样调用:node ./bin/test.js完全没有问题。 但是如果你在子文件夹中调用它:

$ pwd
./bin
$ node ./test.js

导致 dotenv 找不到我的 ./.env 文件的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接