Как мне настроить файл dotenv в Node.js?

Я пытаюсь использовать пакет 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

Я определил TWILIO_ACCOUNT_SID в своем файле .env, но как только я пытаюсь вывести значение в моей консоли, я получаю сообщение об ошибке undefined.

Если у вас есть какие-либо предложения о том, как устранить эту проблему, это будет очень цениться.

Ответы

Ответ 1

В моем случае каждый раз, когда я пытался получить ключ из файла .env, используя process.env.MY_KEY, он возвращал undefined.

Я страдал от этой проблемы в течение двух часов только потому, что назвал файл чем-то вроде keys.env, который не считается файлом .env.

Итак, вот список устранения неполадок:

  1. Имя файла должно быть .env (я думаю, что .env.test также допустимо).

  2. Убедитесь, что вы требуете как можно скорее в своем заявлении, используя это утверждение require('dotenv').config();

  3. Файл .env должен находиться в корневом каталоге вашего проекта.

  4. Следуйте "правилам записи файлов", таким как DB_HOST=localhost, не нужно заключать значения в двойные/одинарные кавычки.

Кроме того, проверьте документацию пакета на сайте NPM.

Ответ 2

Я решил это с помощью:

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

или с абсолютным путем:

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

Если он не найдет файл .env, он вернет undefined.

Ответ 3

Сэкономьте время на устранение неполадок и зарегистрируйте свой запрос на вызов, например:

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

Вы должны увидеть ошибку с более подробной информацией о проблеме.

Ответ 4

Была такая же проблема в последнее время. Проверьте файл .env и используйте знак равенства, а не двоеточие. Вот пример:

key=value

вместо:

key:value

Ответ 5

Я не помещал переменные окружения в нужный формат, как это было в документации модуля dotenv, например, я делал экспорт TWILIO_CALLER_ID = "+wwehehe", и поэтому модуль dotenv не правильно разбирал мой файл. Когда я заметил, что я удалил ключевое слово export из объявлений, и все сработало нормально.

Ответ 6

У меня такая же проблема. Я понял, что мой файл был каким-то образом закодирован в UCS-2 BE BOM. Преобразование моего файла .env в UTF-8 исправило это (вы можете легко сделать это, например, с помощью Notepad++).

Ответ 8

У меня была такая же проблема, и я пробовал 4 часа, чтобы найти ошибку. В моем случае это было странно.

Когда я пробовал "node app.js", он работал. Когда я хотел, чтобы демон начал, это не сработало.

Как я решил свою проблему? Я заменил:

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

с:

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

Ответ 9

Позаботьтесь о том, чтобы вы также выполнили свой сценарий Node из папки ROOT.

Например, я использовал тестовый скрипт в ./bin/test.js под названием ./bin/test.js. Вызвав его так: node./bin/test.js работал совершенно нормально. Вызов из подпапки, например:

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

заставляет dotenv не находить мой файл ./.env.

Ответ 10

Обязательно установите cwd в конфигурации pm2 в соответствующий каталог для любых вызовов dotenv.config().

Пример: ваш файл 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 относительно друг друга.

Ответ 11

Моя проблема была глупой. Я создал.env в текстовом редакторе, и когда я его сохранил, он фактически был сохранен как

'.env.txt' 

которое было видно только после того, как я сделал

'ls -a'

в терминале и увидел имя файла.

Быстрый:

mv .env.txt .env

И я был в бизнесе

Ответ 12

Файл .env должен находиться в корневом каталоге файла js сервера вашего узла (server.js или для меня).

Если вы поместили файл .env в корень вашего проекта, он не будет работать. Моя ошибка состояла в том, что у меня есть файл server.js, вложенный в папку с именем 'controller'.

Поэтому мне пришлось исправить это, поместив файл .env в тот же каталог, что и файл server.js.

Ответ 13

У меня была проблема также с переменными .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 привел к тому, что 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',
    }
);

это начало работать!

Ответ 14

Была такая же проблема. Я использовал dotenv-webpack и нужно определить

plugins: [
  new Dotenv()
]

как в производстве веб-пакетов, так и в базовых файлах веб-пакетов (я использую слияние веб-пакетов). Если не было определено в обоих файлах, то это не сработало.

Ответ 15

В моем случае я создал 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.'
			});
		});
	},

Ответ 16

Мне пришлось буквально не использовать имя для файла .env, просто иметь расширение .env и сохранить файл так, и это сработало.

Ответ 17

Я решил это, просто переименовав файл в .env, чтобы y файл был назван config.env, когда я переименовал в .env, он работает.

Ответ 18

Я потратил много времени на эти исправления. Я разрабатывал локально, и мне просто пришлось перезапустить сервер, потому что файл .env не перегружен.

Ответ 19

Если вы столкнулись с этой проблемой, возможно, переменная (-ы) среды добавлены/загружены после файла, для которого требуется определенная переменная

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

в приведенном выше случае вы получите undefined для process.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)