Переменные среды не загружаются в process.env в Nodejs

#node.js #ubuntu #amazon-ec2 #environment-variables

#node.js #ubuntu #amazon-ec2 #переменные среды

Вопрос:

Я создаю API nodejs и настроил dotenv пакет как зависимость от разработчика для загрузки переменных в process.env на локальных компьютерах разработчика.

Обратите внимание, что при входе в систему я использую sudo -i для работы как root .

Мое намерение состоит в том, чтобы во время развертывания переменные среды были установлены на моем хосте Ubuntu под /etc/environment , загружены непосредственно в процесс, а затем приложение просто запустилось бы для этой конфигурации.

Для этого у меня есть строка в начале server.js :

 if(process.env.NODE_ENV === 'development') {
    logger.info("Loading dotenv for development environment")
    require('dotenv').config();
}
  

И разработчикам будет предложено добавить переменную среды в свою систему для NODE_ENV .

Теперь, в моем экземпляре Ubuntu EC2, я настроил /etc/environment так, чтобы у меня были переменные среды, которые я хочу (обратите внимание, что NODE_ENV здесь является ‘dev’, просто чтобы избежать запуска dotenv):

 PORT=MYPORT
NODE_ENV=dev
APP_SECRET_KEY='MYSECRET'
APP_DATABASE_LOGIN=MYLOGIN
APP_DATABASE_PASSWORD='MYPASS'
APP_DATABASE_HOST=MYHOST
APP_DATABASE_NAME=MYDB
APP_DATABASE_PORT=MYDBPORT
  

И когда я перезагружаюсь и запускаю printenv , все они заполняются для каждого файла.

У меня есть настройка pm2 для запуска моего приложения напрямую из server.js без какой-либо дополнительной настройки, потому что, насколько я понимаю, process.env оно заполняется автоматически из переменных среды.

Однако, когда я регистрирую значения из process.env, я просто получаю null для всего:

 logger.info({
    connectionConfig: {
        host: process.env.APP_DATABASE_HOST
        , login: process.env.APP_DATABASE_LOGIN
        , port: process.env.APP_DATABASE_PORT
        , databaseName: process.env.APP_DATABASE_NAME
    }
});
  

Что-то не так с конфигурацией как есть здесь?

Примечание: Согласно приведенному ниже ответу, я ошибочно настроил свои переменные среды ПОСЛЕ запуска pm2, и поэтому в кешировании pm2 они отсутствовали

Комментарии:

1. что произойдет, если вы запустите его без pm2 ?

2. @MarcosCasagrande Когда я запускаю npm start напрямую, переменные среды загружаются корректно, но поскольку PM2 уже запущен и использует порт, происходит сбой

Ответ №1:

Проблема в том, что pm2 переменные среды кэшируются.

Вы должны сделать:

 # all apps
pm2 restart all --update-env
# specific app
pm2 restart {pid} --update-env
  

Если по какой-то причине это не сработает, документированный способ:

 pm2 reload ecosystem.json --update-env
  

Вы можете прочитать больше здесь:

Комментарии:

1. Привет, Маркос — спасибо за это. Ваш первоначальный вопрос заставил меня разобраться, и я пришел к тому же выводу. Тем не менее, исправление для меня заключалось в выполнении pm2 restart --update-env all . Можете ли вы поместить это в качестве первой строки вашего ответа, чтобы я мог принять?

2. Добавлена и эта строка.

3. Я ошибочно настроил свои переменные среды ПОСЛЕ запуска pm2 ранее в процессе и не знал о кэшировании — еще раз спасибо!

Ответ №2:

Я столкнулся с той же проблемой, это из-за встроенного терминала в Visual Studio и кода visual studio, кажется, что у них нет доступа ни к одной из этих переменных, если вы не запустите редактор в Admin mode.so чтобы решить эту проблему, вам просто нужно запустить ваш редактор в режиме Amin

Ответ №3:

Убедитесь, что у вас есть этот код в app.js файл

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