Почему мой пользовательский файл process.env не работает в dotenv?

Узнав, что включать секретные ключи API — плохая практика, я провел небольшое исследование и попытался узнать, как создавать собственные process.env.

После прочтения:

Я пытаюсь установить файл env локально на основе process.env.NODE_ENV. Приложение будет размещено на Heroku, и в моем .gitignore у меня есть dev.env, но когда я пытаюсь использовать dotenv локально я получаю undefined. Я установил среду локально с помощью export NODE_ENV=development в своем терминале. Когда я запускаю команду npm start или nodemon, обе возвращают undefined, но в env.js я получаю Testing for: development, например:

nodemon

[nodemon] 1.19.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node app.js`
Testing for: development
undefined

Вот что у меня есть:

app.js:

const keys = require('./config/env')
return console.log(process.env.PORT)

config/env.js:

const env = process.env.NODE_ENV
console.log(`Testing for: ${env}`)
try {
  switch(env) {
    case 'undefined':
      Error('Environment undefined, if local in terminal: export NODE_ENV=development')
      break
    case 'development':
      require('dotenv').config({
        path: './dev.env'
      })
      break
    case 'production':
      require('dotenv').config({
        path: './prod.env'
      })
      break
    default:
      Error('Unrecognized Environment')
  }  
} catch (err) {
  Error('Error trying to run file')
}

config/dev.env:

## Port number to run Application
PORT=4321

но в app.js, когда я тестирую с return console.log(process.env.PORT) или return console.log(keys.PORT), они оба регистрируют undefined, почему? Кажется, я делаю что-то неправильно в env.js при использовании dotenv.

Чтобы уточнить, я еще даже не продвигаюсь к Heroku, и prod.env будет проверкой. Если есть лучший подход, пожалуйста, просветите меня.


person DᴀʀᴛʜVᴀᴅᴇʀ    schedule 26.07.2019    source источник
comment
Вы уверены, что используете сервер узлов с NODE_ENV=development node src/main.js?   -  person deepchudasama    schedule 26.07.2019
comment
Я запускаю nodemon и в app.js вызываю console.log. При вызове env.js и ведении журнала NODE_ENV я получаю журнал «разработки».   -  person DᴀʀᴛʜVᴀᴅᴇʀ    schedule 26.07.2019
comment
Я думаю, вам следует запустить такой скрипт: NODE_ENV=development nodemon main.js   -  person deepchudasama    schedule 26.07.2019
comment
@ d337 Насколько я понимаю, если было установлено export NODE_ENV=development, оно должно работать с npm start или nodemon   -  person DᴀʀᴛʜVᴀᴅᴇʀ    schedule 26.07.2019
comment
Кроме того, когда в app.js выполнение console.log(process.env.NODE_ENV) возвращает разработку в терминале.   -  person DᴀʀᴛʜVᴀᴅᴇʀ    schedule 26.07.2019


Ответы (4)


Я понял, где ошибся, перечитав документацию по path, например:

require('dotenv').config({ path: '/full/custom/path/to/your/env/vars' })

После изменения:

case 'development':
  require('dotenv').config({
    path: './dev.env'
  })
  break

to:

case 'development':
  require('dotenv').config({
    path: `${__dirname}/dev.env`
  })
  break

оно работает. Итак, моя ошибка была связана с масштабом. Нет необходимости устанавливать const keys, поэтому, просто используя require('./config/env'), я могу получить доступ к любым пользовательским процессам, например:

process.env.CUSTOM

или в этом случае это будет:

process.env.PORT

из app.js

person DᴀʀᴛʜVᴀᴅᴇʀ    schedule 26.07.2019
comment
Для справки в будущем dotenv вернет ошибку, если не сможет найти или прочитать файл, указанный вами с помощью параметра path. Мы обнаруживаем ошибки, чтобы помочь с отладкой, подобной этой. - person maxbeatty; 09.08.2019

Привет, сначала используйте switch(env.trim()), затем измените значение пути path: './config/dev.env'. Удачи.

person Stanislav Baturin    schedule 26.07.2019

Вы получаете эту ошибку, потому что вам нужно установить эти переменные среды, поскольку у нас нет файлов .env, тогда как на сервере разработки dotenv устанавливает их для вас, используя ваш файл .env.

Вам нужно установить эти переменные либо через веб-интерфейс, либо через интерфейс командной строки heroku. Этот документ heroku поможет вам.

person Aakash    schedule 26.07.2019
comment
Я знаю, как установить в CLI, что проблема заключается в использовании пользовательского процесса в разработке. Думаю, вы неправильно понимаете вопрос. Я могу зарегистрировать NODE_ENV, поэтому ошибка от env.js до dotenv. - person DᴀʀᴛʜVᴀᴅᴇʀ; 26.07.2019
comment
насколько я понял, config() указывает путь к каталогу, в котором находится файл с именем .env. Так что это одна проблема. Что мы делаем, так это заменяем .env файлом .env.‹build_type› перед сборкой. - person Aakash; 26.07.2019
comment
И именно поэтому в env.js я устанавливаю путь в config с помощью path: './dev.env'. Возможно, я делаю это неправильно, но согласно документации это правильный способ объявить файл, если не использовать .env. - person DᴀʀᴛʜVᴀᴅᴇʀ; 26.07.2019

Heroku не работает на dotenv.

У него есть что-то под названием «Config Vars» на странице настроек данного приложения Heroku:

Например

Переменные конфигурации Heroku

В вашем примере, если код хочет получить доступ: process.env.NODE_ENV, вы должны установить новую переменную конфигурации на странице настроек Heroku данного приложения и назвать ее NODE_ENV. Установите желаемое значение и нажмите «Сохранить». Вуаля. Сделанный.

Дополнительная ценность dotenv обычно заключается в тестировании на вашем локальном компьютере.

person Elisha Kramer    schedule 26.07.2019