Файл dotenv не загружает переменные окружения
У меня есть файл.env в корневой папке
NODE_ENV=development
NODE_HOST=localhost
NODE_PORT=4000
NODE_HTTPS=false
DB_HOST=localhost
DB_USERNAME=user
DB_PASSWORD=user
А также server.js
файл в root/app/config/server.js
папка. Первая строка server.js
файл
require('dotenv').config();
Я также попробовал следующее:
require('dotenv').config({path: '../.env'})
;
require('dotenv').config({path: '../../.env'})
;
Однако моя переменная env не загружается, когда я запускаю server.js
файл из командной строки
node root/app/config/server.js
Если я использую Visual Studio и нажимаю F5, он загружается!
Я не уверен, что я делаю неправильно, чего мне не хватает. Любое предложение высоко ценится. Благодарю.
31 ответ
Как насчет использования require('dotenv').config({path:__dirname+'/./../../.env'})
?
Ваша проблема, кажется, путь выполнения.
Это решило мои проблемы в узле 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
Вот еще одна хорошая альтернатива:
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
Добавив небольшой нюанс к ответу выше - если вы вызываете dotenv
из вложенного файла, и ваш .env
Файл находится в корне проекта, способ подключения точек через следующее:
require('dotenv').config({path:'relative/path/to/your/.env'})
Один из комментариев в ответе @DavidP отмечает, что вывод dotenv.config регистрируется с помощью console.log(require("dotenv"). Config()). Это выведет журнал конфигурации и отобразит ошибки. В моем случае это указывало на то, что метод конфигурации ссылался на текущий каталог, а не на родительский каталог, который содержал мой файл .env. Я смог сослаться на это следующим
У меня была эта проблема, и оказалось, что REACT загружает только переменные с префиксом REACT_APP_
VueJs может иметь аналогичную проблему, поскольку ожидает, что переменные будут иметь префикс: VUE_APP_
В удаленном случае, когда вы дойдете до этого момента, моя проблема была довольно глупой: я неправильно назвал свои переменные env двоеточием ":" вместо равно "=". Ошибка новичка, но результирующее поведение не загружало присвоение переменных с ошибками.
# dotenv sample content
# correct assignment
USER=sample@gmail.com
# wrong assignment (will not load env var)
USER : sample@gmail.com
Обязательно загрузите
.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;
. Затем получите доступ к моему DATABASE_URL как к объекту JS:
dotenv.DATABASE_URL
Это решило проблему для меня:
const path = require('path');
require('dotenv').config({
path: path.resolve('config.env'),
});
Попробуй это:
const dotenv = require('dotenv');
dotenv.config({ path: process.cwd() + '/config/config.env' });
работал у меня, иди, как ??
const path = require('path');
const dotenv = require('dotenv');
dotenv.config({ path: path.resolve(__dirname, '../config.env') })
я нашел вариантdebug: true
для отправки в конфиге, который показал мне следующее:
[dotenv][DEBUG] "PORT" is already defined in `process.env` and was NOT overwritten
я добавилoverwrite: true
и заработало:
[dotenv][DEBUG] "PORT" is already defined in `process.env` and WAS overwritten
Я знаю, что могу опоздать с ответом, но решил поделиться своими выводами после нескольких часов проверки документации.
Мне потребовалось несколько головокружений, и совет по протоколированию вывода оператора require на консоль оказался действительно полезным.
console.log(require('dotenv').config());
Оказывается, я запускал свое приложение из своего пользовательского/каталога с помощью
nodemon application_name/.
и это заставляло dotenv искать файл .env в моем домашнем каталоге, а не в приложении. мне было лень пропускать один
cd
и это стоило мне нескольких минут lmao. Примечание для себя: создайте псевдоним для cd в каталоге приложения и запустите его.
В моем случае .env
читалось нормально, но не .env.local
.
Обновление package.json
называть .env
в .env.local
(cp ./.env.local .env
) решил проблему:
"myscript": "cp ./.env.local .env && node ./scripts/myscript.js"
Если вы установлены как производственная зависимость. Тогда он может работать некорректно. .env
Файл обычно используется во время разработки при импорте переменных среды в среду приложения. Так,
npm install --save-dev dotenv
Не то:
npm install dotenv
Для правильной работыdotenv
библиотеке, вам всегда нужно упоминать этот код:
import dotenv from "dotenv"
dotenv.config();
В верхней части файла вот так:
Если вы поместите эту конфигурацию посередине. Затем вы увидите некоторое проводное поведение . Например, в каком-то файлеenv
переменный рабочий файл. Но в некоторых это не так.
У меня возникла проблема с кодировкой файла в Windows. Он был закодирован в UTF-16LE . Файл был проанализирован, но считался пустым. После того, как я преобразовал.env
файл в UTF-8 , все работает как положено.
Машинопись.
если вы пытаетесь разрешить __dirname и компилируете исходную папку в другой папке, убедитесь, что вы редактируете __dirname. в моем случае я компилирую ts в папке dist, а файлы env находятся не в папке dist, а в корневой папке. поэтому вы должны удалить /dist из __dirname. Чтобы отладить его, вы можете вызвать функцию error(), которая возвращает ошибку, если есть проблема с чтением файла env.
require('dotenv').config({
path: __dirname.replace('\dist','') + `${process.env.NODE_ENV}.env`
}); # To debug .error()
другое дело, когда вы устанавливаете переменные env, убедитесь, что следующее: нет пробела между переменной и (&&) следующим образом
"scripts": {
"build": "npx tsc",
"start": "set NODE_ENV=production&& node dist/index.js",
},
Вам может понадобиться путь к файлу .env относительно текущего рабочего каталога, из которого было запущено приложение. Вы можете создать этот путь следующим образом:
const path = require('path')
require('dotenv').config({path: path.relative(process.cwd(), path.join(__dirname,'.env'))});
process.cwd()
возвращает абсолютный путь к рабочему каталогу.
__dirname
возвращает абсолютный путь к приложению.
path.join()
добавляет путь .env-файла к пути приложения. поэтому, если ваш файл .env вложен глубже, просто добавьте папки (например,
path.join(__dirname, 'config', 'secret','.env')
)
path.relative()
создает относительный путь.
Однажды у меня возникла такая же проблема. Dotenv не загрузил файл.env. Я попытался решить эту проблему с помощью конфигурации пути, поместить файл.env в корневую папку, поместить.env в папку, в которой работает файл, и мне ничего не помогает. Затем я просто выбросил папку Node_modules, переустановил все зависимости, и она работает правильно
Если вы используете dotenv внутри своего приложения на основе responseJS, вы должны использовать REACT_APP перед своей переменной. Например, внутри файла dotenv, созданного в корневой папке, используйте такой синтаксис
REACT_APP_MAP_TOKEN='pk.eyJ1Ijoic2F5aW5tZWhtZXQ0'
Затем, если вы хотите вызвать его внутри своего компонента, вызовите его так, после того, как потребуете его с помощью
require('dotenv').config();
console.log(process.env.REACT_APP_MAP_TOKEN);
Я использую:
import findUp from 'find-up';
dotenv.config({ path: findUp.sync('.env') });
Что сработало для меня с использованием драматурга / машинописного текста :
1 создайте файл и поместите в корень проекта:global-setup.ts
добавить внутрь:
async function globalSetup() {
// Configure ENV variables
require('dotenv').config()
}
export default globalSetup
2 Затем используйте этот файл вplaywright.config.ts
как:globalSetup: require.resolve('./global-setup'),
Таким образом создается глобальная конфигурация, и она загружается в каждом отдельном тесте.
Я столкнулся с той же проблемой, и вот как в итоге выглядел мой рабочий код. У меня был файл .env в отдельной папке конфигурации
const dotenv = require('dotenv');
dotenv.config({ path: './config/.env' });
Используйте только абсолютный путь, если вы используете какой-либо другой инструмент (установленный глобально) для вызова вашего файла конфигурации где-то...
require('dotenv').config({
path: '/path/to/my/project/.env',
});
Одна глупая ошибка, которую я сделал, заключалась в том, что я использовал двоеточие ":" вместо "=".
я использовал ниже
ПОЛЬЗОВАТЕЛЬ: root
Но это должно быть
ПОЛЬЗОВАТЕЛЬ=корень
Если ничего не помогает, поместите ваш .env вне папки src, если у вас есть структура папок, например
-src/
- index.js
- env.js (where you call dotenv.config)
// you may call dotenv.config anywhere but entry point is best.
.env (file outside the src folder)
Просто добавь
в индекс вашего приложения, он найдет ваш файл .env, затем вы можете использовать process.env.YOUR_ENV в любом месте вашего кода