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


76

我正在尝试使用dotenvNPM软件包,但它对我不起作用。我有一个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

TWILIO_ACCOUNT_SID.env文件中定义了,但是尝试在控制台中输出该值时,立即收到错误消息undefined

如果您对如何解决此问题有任何建议,将不胜感激。


在REPL和运行脚本中都对我有用。您正在使用哪个版本的节点,并且可以显示.env文件的示例吗?
Ben Fortune

Answers:


127

就我而言,每次我尝试.env使用从文件中获取密钥时process.env.MY_KEY,它都会返回undefined

我因这个问题而遭受了两个小时的苦难,因为我给文件命名了一个keys.env不被认为是.env文件的名称。

因此,这是故障排除列表:

  1. 文件名应该是.env(我相信.env.test也是可以接受的)。

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

  3. .env文件应位于项目的根目录中。

  4. 遵循的“文件编写规则” DB_HOST=localhost,无需将值用双引号或单引号引起来。

另外,请在NPM网站上检查软件包文档


7
.env文件移动到它工作的项目的根目录。
chandan'8

4
好,非常感谢您的投入!这是我的问题。可能只是为我和其他人节省了两个多小时。
迪伦

同意,在我的项目缓慢扩展之后,此导入项被调低了,这为我节省了大量时间。干杯!
埃尔金

非常感谢!我只是因为它看起来像.ENV文件是在根目录下我的代码编辑器失去了一个小时的调试。不是……
Iulius

1
我将其命名为“ twitter.env”,而不仅仅是“ .env”。 感叹
thargenediad

60

我用以下方法解决了这个问题:

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

或使用绝对路径:

C:\\asd\\auhsd\\.env

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


1
完善!我之所以需要它,是因为我将NodeJS项目作为服务运行(大致遵循本教程),事实证明,在这种情况下,服务无法找到.env文件。指定绝对路径就是解决方案!!
形态

很好,谢谢!在容器化环境中使用它,不确定是否是原因,但是如果您使用的是docker并遇到问题,请尝试此修复!
DORRITO

51

为您节省一些故障排除时间并记录您的需求呼叫,如下所示:

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

您应该会看到一个错误,其中包含有关该问题的更多详细信息。


9
您可以更进一步,并在选项中添加{debug:true}。console.log(require('dotenv')。config({debug:true})));
亚历克斯斯坦迪福德

请注意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日志乘以秘密数量。不知道它是否增加了我的案子,但
赞成

19

最近有同样的问题。检查您的.env文件,并使用等号而不是冒号。这是一个例子:

key=value

代替:

key:value

超级答案!我正在做的这个错误
CandleCoder

太棒了!!! 经过3小时的调试,我找到了正确的答案
jithu

13

我有同样的问题。我意识到我的文件是以某种方式编码的UCS-2 BE BOM。将我的.env文件转换为UTF-8固定文件(例如,您可以使用Notepad ++轻松地完成该操作)。


4
你救了我的一天!我在powershell脚本中使用echo命令通过TFS生成.env文件,但该文件以UCS-2编码保存。所以现在我确定powershell将其保存为utf-8,并且一切正常!
AlfredBrockötter,

1
你是我的英雄!这也是我的问题!
菲尔(Phil)

8

我没有像dotenv模块文档中那样以正确的格式放置环境变量,例如,我正在导出TWILIO_CALLER_ID =“ + wwehehe”,因此dotenv模块无法正确解析我的文件。当我注意到我从声明中删除了export关键字时,一切正常。


7

确保尚未设置变量。Dotenv不会覆盖它们。

如果设置了变量,则必须将其删除。在powershell中,您可以使用以下命令-如此处所述

Remove-Item Env:\MyTestVariable

1
谢谢!这是我的问题。我出于某种原因定义了我的环境。变量就像DATABASE_URL=在我的外壳中一样,但是忘了它。它根本没有出现在我的身上process.env,包括作为一个空字符串-太烦人了!一位unset DATABASE_URL后来和我.ENV被正确读取。
Brian Peterson

很高兴让我知道它有所帮助:)
korteee

如果可以的话,+ 2为您的好友
Mariusz

6

我遇到了同样的问题,我尝试了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
CENT1PEDE

6

我也遇到了一个问题,.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',
    }
);

显然,由于在Node.js中加载导入的方式是如何进行的,因此在中导入模型会index.js导致在执行models.js之前dotenv.config()。因此,我从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',
    }
);

它开始工作了!


5

请注意,您还要从ROOT执行Node脚本文件夹。

例如,我在名为的子文件夹中使用了测试脚本./bin/test.js。像这样称呼:node ./bin/test.js工作得很好。从子文件夹调用它,例如:

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

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


5

对于任何对dotenv.config()的调用,请确保将pm2配置中的cwd设置为正确的目录。

示例:您的index.js文件位于/ app / src中,您的.env文件位于/ app中。您的index.js文件具有此内容

dotenv.config({path:“ ../.env”});

您的pm2 json配置应具有以下内容:“ cwd”:“ / app / src”,“ script”:“ index.js”

您也可以使用dotenv.config({path:path.join(__ dirname,“ ../.env”)});; 以避免CWD问题。如果相对于彼此移动.env或index.js文件,您仍然会遇到问题。


4

工作解决方案:

如果您正在使用webpack(肯定应该使用),请使用非常方便的插件dotenv-webpack,它可以解决从.env文件读取环境变量的问题

确保.env位于项目的根目录中。

安装插件的步骤:

  1. npm i -D dotenv-webpack
  2. webpack.config文件中:
     const Dotenv = require('dotenv-webpack');
     module.exports = {
          ...
          plugins: [
                new Dotenv(),
                ...
          ],
          ...
     };

现在,您可以在任何文件中.env使用process.envjs文件中定义的任何环境变量


4

我使用的代码结构如下所示

-.env
-app.js
-build
-src
   |-modules
        |-users
            |-controller
                  |-userController.js

我在app.js的顶部需要.env

require('dotenv').config();
import express = require('express');
import bodyParser from 'body-parser';
import mongoose = require('mongoose');

process.env.PORT可在我的app.listen函数中使用。但是,在我的userController文件上,不确定这是怎么发生的,但是我的问题是,当我使用console.log()检查时,我正在获取secretKey值并以字符串形式输入,但是在jwt.sign()上尝试时却未定义,例如

console.log('Type: '+ process.env.ACCESS_TOKEN_SECRET)
console.log(process.env.ACCESS_TOKEN_SECRET)

结果:

string
secret

jwt.sign给出错误

let accessToken = jwt.sign(userObj, process.env.ACCESS_TOKEN_SECRET); //not working 

错误原为

    Argument of type 'string | undefined' is not assignable to parameter of type 'Secret'.
  Type 'undefined' is not assignable to type 'Secret'.

我的解决方案:阅读文档后。我再次在文件中要求环境(我可能应该首先拥有它)并将其保存到变量“环境”中

let environment = require('dotenv').config();

控制台日志记录环境提供了:

{
parsed: {
    DB_HOST: 'localhost',
    DB_USER: 'root',
    DB_PASS: 'pass',
    PORT: '3000',
    ACCESS_TOKEN_SECRET: 'secretKey',
  }
}

在jwt.sign上使用它不起作用

let accessToken = jwt.sign(userObj, environment.parsed.ACCESS_TOKEN_SECRET);

希望这会有所帮助,我被困了几个小时。请随时在我的答案中添加任何内容,这可能有助于进一步说明。


声明require('dotenv')。config(); 在index.js上工作ty :)!

3

我的问题很愚蠢。我在文本编辑器中创建了.env,当我保存它时,它实际上另存为

'.env.txt' 

只有在我做了一个

'ls -a'

在终端中,看到了文件名。

快速:

mv .env.txt .env

我在做生意


3

“ .env”文件应位于您的节点js服务器文件的根目录中(server.js或对我而言)。

如果将“ .env”文件放置在项目的根目录下,它将无法正常工作。我的错误是我将server.js文件嵌套在名为“ controller”的文件夹中。

因此,我必须通过将.env文件放置在与server.js文件相同的目录中来进行修复。


3

对于使用create-react-app模板创建的React应用程序,您无需dotenv直接使用。react-scripts为您做到这一点。

只需.env在项目的顶级目录中创建一个文件,然后在其中添加所有环境,但请注意,它们必须REACT_APP前缀开头,否则将被忽略。

在其文档中有更多详细信息。我花了几个小时来处理这个问题,希望它可以节省您一些时间。


3

我在Windows 10上使用NodeJS。我使用process.env.var-name来访问变量,但由于将Windows路径变量作为JSON对象提供给我而失败,因此我安装了dotenv(npm install dotenv)。dotenv项目的.evn文件中获取过程环境变量

  1. npm install dotenv或yarn add dotenv

在此处输入图片说明

  1. const dotenv = require('dotenv'); dotenv.config();

在此处输入图片说明

  1. process.env.variable_name

在此处输入图片说明 在此处输入图片说明

  1. 输出

在此处输入图片说明


我怀疑这是否有帮助,甚至根本没有效果。为了使我信服,请解释一下它是如何工作的以及为什么会起作用。
Yunnosch '20

1
我在Windows 10上使用NodeJS时,当我对process.env进行字符串化时,它将Windows路径变量作为JSON对象提供给我,因此我安装了它,并将process.env设置为在项目中创建的.env文件
Rashid Iqbal

更好。现在,请编辑该内容以改善您的回答,而不必在注释中将其隐藏在此处。
Yunnosch '20

2

有同样的问题。我曾经dotenv-webpack需要定义

plugins: [
  new Dotenv()
]

双方的WebPack生产的WebPack基本文件(我用的WebPack合并)。如果未在两个文件中都定义,则无法正常工作。


1

就我而言,我创建了一个包装器JS文件,在其中我可以根据自己的环境动态选择正确的变量。

我有这两个函数,一个是简单的dotenv功能的包装,另一个是区分环境并将结果设置为process.env对象。

setEnvVariablesByEnvironment : ()=>{
		return new Promise((resolve)=>{

			if (process.env.NODE_ENV === undefined || process.env.NODE_ENV ==='development'){
				logger.info('Lower / Development environment was detected');

				environmentManager.getEnvironmentFromEnvFile()
					.then(envFile => {
						resolve(envFile);
					});

			}else{
				logger.warn('Production or Stage environment was detected.');
				resolve({
					payload: process.env,
					flag: true,
					status: 0,
					log: 'Returned environment variables placed in .env file.'
				});
			}


		});
	} ,

	/*
	Get environment variables from .env file, using dotEnv npm module.
	 */
	getEnvironmentFromEnvFile: () => {
		return new Promise((resolve)=>{
			logger.info('Trying to get configuration of environment variables from .env file');

			env.config({
				debug: (process.env.NODE_ENV === undefined || process.env.NODE_ENV === 'development')
			});

			resolve({
				payload: process.env,
				flag: true,
				status: 0,
				log: 'Returned environment variables placed in .env file.'
			});
		});
	},

因此,在我的server.js文件中,我仅添加了参考:

const envManager = require('./lib/application/config/environment/environment-manager');

在我的入口点(server.js)中,使用起来很简单。

envManager.setEnvVariablesByEnvironment()
.then(envVariables=>{
    process.env= envVariables.payload;

    const port = process.env.PORT_EXPOSE;
    microService.listen(port, '0.0.0.0' , () =>{

        let welcomeMessage = `Micro Service started at ${Date.now()}`;
        logger.info(welcomeMessage);

        logger.info(`${configuration.about.name} port configured  -> : ${port}`);
        logger.info(`App Author: ${configuration.about.owner}`);
        logger.info(`App Version: ${configuration.about.version}`);
        logger.info(`Created by: ${configuration.about.author}`);

    });
});



1

如果您遇到此问题,则可能是在需要特定变量的文件之后添加/加载了环境变量

const express = require('express');

const app = express();
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const morgan = require('morgan');

const passport = require('passport'); //you want to use process.env.JWT_SECRET (you will get undefined)

dotenv.config();

在上述情况下,你会得到undefinedprocess.env.JWT_SECRET

所以,解决的办法是你把dotenv.config()const passport = require('passport');

const express = require('express');

const app = express();
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const morgan = require('morgan');
dotenv.config();   
const passport = require('passport'); //you want to use process.env.JWT_SECRET (you will get the value for the enviroment variable)

1
在我的情况下,甚至在const express = require('express');之前……解决了我的问题!
Meiki Neumann

1

我花了很多时间来进行这些修复。我在本地进行开发,由于.env文件未热重载,因此只需要重新启动服务器即可。


1

您的项目中安装了dotenv吗?

尝试npm install dotenv在项目中使用进行安装。

安装完成后,请使用将其加载到需要的任何文件中const env = require('dotenv').config()

然后,您可以在需要的任何行中使用。例如,从.env调用端口,请使用:process.env.PORT


1

如果您使用“ firebase-functions”托管您的服务器端渲染的应用程序,则应注意以下内容:

错误:错误:ENOENT:没有这样的文件或目录,打开'C:\ Codes \ url_shortener \ functions \ .env'

意味着您还必须将.env文件存储在functions文件夹中。

通过以下方式找到了这个:

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

1

我从Github克隆了一个仓库,并仔细阅读了这里的所有建议。经过很多挫败之后,我意识到npm install没有安装任何模块,并且我的node_modules文件夹一直都是空的。

快速修复:
1)删除node_modules文件夹
2)删除您的package-lock.json
3)运行npm install


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

1

我有同样的问题。我创建了一个名为.env的文件,但实际上该文件最终是.env.txt。

我创建了一个新文件,并以“无扩展名”的形式保存它,该文件是真实的.env文件,并且运行良好。


1

这就是我解决问题的方式

最初在我项目的根目录.env中具有此功能

const db_port = 90101
const db_host="localhost"
const db_username="name"
const db_password="pwd"
const db_name="db"

还有我所有的env变量都未定义。

我通过删除所有const并仅使用由const key =“ value”插入的key = value来解决此问题

db_port = 90101
db_host=localhost
db_username=name
db_password=pws
db_name=db

0

在某些操作系统上(大多数情况下是Linux发行版,我在看着您是raspbian),. env文件不起作用。重命名它们并导入

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.