Как мне настроить файл 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
.
Итак, вот список устранения неполадок:
Имя файла должно быть .env
(я думаю, что .env.test
также допустимо).
Убедитесь, что вы требуете как можно скорее в своем заявлении, используя это утверждение require('dotenv').config();
Файл .env
должен находиться в корневом каталоге вашего проекта.
Следуйте "правилам записи файлов", таким как 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++).
Ответ 7
Убедитесь, что переменные еще не установлены. Dotenv не будет переопределять их.
Если переменные установлены, вам придется их удалить. В powershell вы можете использовать следующую команду - как упомянуто здесь:
Remove-Item Env:\MyTestVariable
Ответ 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)