Файл 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"

если файл config.env и файл index.js находятся в одном каталоге:

затем файл: index.js

      const path = require('path'); 

//  Set port from environment variables
dotenv.config({path: 'config.env'})
const PORT = process.env.PORT || 8080

файл: config.env:

      PORT = 4000

Если вы установлены как производственная зависимость. Тогда он может работать некорректно. .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)

Самое быстрое исправление здесь, всего за секунды, добавить переменные на платформу, которую вы используете в моем случае render.com

Просто добавь

в индекс вашего приложения, он найдет ваш файл .env, затем вы можете использовать process.env.YOUR_ENV в любом месте вашего кода

Другие вопросы по тегам