Node.js не читает переменные окружения, установленные в нативном терминале Mac.

Вопрос или проблема

Я запускаю приложение на Node.js из VS Code. Я хотел сохранить свой пароль от базы данных в переменной окружения. Я экспортировал данные в терминале на своем Mac, и при выполнении команды echo я смог получить данные.

export MONGO_PASSWORD="PASSWORD"
echo $MONGO_PASSWORD // выводит пароль

Однако, когда я открываю встроенный терминал в VS Code, он не показывает значение.

echo $MONGO_PASSWORD // выводит пусто

Также, когда я подключился к CLI node и ввёл process.env, он не включает мою переменную.

process.env.MONGO_PASSWORD // выводит undefined

В качестве временного решения, я смог установить и экспортировать переменную из файла ~/.zshrc на своем Mac. Тем не менее, мне все еще любопытно, почему встроенный терминал VS Code не может читать значения, экспортированные в терминале Mac, и есть ли способ это исправить.

Мне все еще любопытно, почему встроенный терминал VS Code не может читать значения, экспортированные в терминале Mac, и есть ли способ это исправить.

В zsh команда export делает то, что заявляет в сопроводительной man странице:

Указанные имена помечаются для автоматического экспорта в окружение последующих выполняемых команд […]

Экспорты в встроенном терминале в VS Code выполняются в отдельном экземпляре оболочки, который вы вызвали в Terminal.app, поэтому одна оболочка не знает имен, экспортированных в другой.

Нет способа “исправить” это поведение, так как оно работает так, как задумано.

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, как работает окружение оболочки в macOS и, в частности, с тем, как VS Code обрабатывает переменные окружения.

Когда вы устанавливаете переменную окружения с помощью команды export в терминале macOS (Terminal.app), эта переменная экспортируется только в текущую сессию оболочки. Это означает, что она будет доступна только в этой конкретной сессии терминала. Когда вы открываете интегрированный терминал в VS Code, он начинает новую, отдельную сессию оболочки, которая не имеет доступа к переменным, установленным в другой сессии.

Поэтому, когда вы вводите echo $MONGO_PASSWORD в интегрированном терминале VS Code, он возвращает пустое значение, потому что переменная MONGO_PASSWORD была установлена только в окружении терминала, а не в глобальном окружении, доступном для всех сессий.

Решения:

  1. Добавление переменных в конфигурацию оболочки: Как вы уже сделали, вы можете добавить переменные окружения в файл ~/.zshrc (или ~/.bash_profile, если вы используете bash). Это обеспечит загрузку переменных при каждом новом запуске терминала, включая интегрированные терминалы в VS Code.

    export MONGO_PASSWORD="PASSWORD"

    После внесения изменений в ~/.zshrc обязательно выполните команду source ~/.zshrc, чтобы применить изменения, или просто перезапустите терминал.

  2. Установка переменных окружения непосредственно в VS Code: В настройках VS Code вы можете задать переменные окружения, которые будут доступны в интегрированном терминале. Это делается через файл конфигурации .env в корне вашего проекта или через настройки в settings.json.

  3. Проверка настроек терминала VS Code: Убедитесь, что VS Code использует ту же оболочку, что и ваш терминал. В настройках (settings.json) вы можете указать, какую оболочку использовать:

    "terminal.integrated.shell.osx": "/bin/zsh"  // или путь к вашей оболочке
  4. Использование файла .env для конфигурации: Если вы используете библиотеки, такие как dotenv, вы можете создать файл .env в корне вашего проекта и ввести туда ваши переменные окружения:

    MONGO_PASSWORD=PASSWORD

    Затем, в вашем коде Node.js, вы можете загрузить эти переменные:

    require('dotenv').config();
    console.log(process.env.MONGO_PASSWORD);

Заключение

Изоляция окружений между разными сессиями оболочки — это стандартное поведение в UNIX-подобных системах, таких как macOS. Понимание этого поведения поможет вам более эффективно управлять переменными окружения и минимизировать путаницу в будущем. Выбор подходящего решения зависит от ваших нужд и предпочтений, но каждый из предложенных методов поможет вам решить вашу проблему.

Оцените материал
Добавить комментарий

Капча загружается...