process.env.NODE_ENV не определен

170

Я пытаюсь следовать учебнику по NodeJ. Я не думаю, что что-то пропустил, но всякий раз, когда я вызываю, process.env.NODE_ENVединственное значение, которое я получаю, не определено. Согласно моим исследованиям значением по умолчанию должно быть «развитие». Как динамически устанавливается это значение и где оно устанавливается изначально?

basheps
источник
установить NODE_ENV для приложений heroku, которые вы можете использовать:heroku config:set NODE_ENV="production"
Коннор Лич
14
Хотя ответы, приведенные ниже, позволят временно решить проблему, установив переменную среды, урок здесь должен состоять в том, что вы никогда не узнаете, будет ли установлена ​​какая-либо переменная среды ... Поэтому напишите свой код соответствующим образом и проверьте, установлена ​​ли она, и если да, к чему. Не делайте предположений об этом.
Стейн де Витт

Ответы:

193

process.env - это ссылка на вашу среду, поэтому вы должны установить переменную там.

Чтобы установить переменную среды в Windows :

SET NODE_ENV=development

в OS X или Linux :

export NODE_ENV=development
Джеймс Тикальский
источник
4
Вы можете добавить, что, если NODE_ENV не установлен, приложение ведет себя как в режиме «разработки»
Rocco
1
Для Linux: vi ~ / .bash_profile, затем вставьте NODE_ENV = development и сохраните.
stonyau
6
В случае, если кто-то еще борется ... есть разница между "SET V = VAL" и "SET V = VAL". Пространства имеют значение.
Виллем
4
Обратите внимание, что модуль «cross-env» делать аналогично вышеуказанному, и он будет работать как на OSX, так и на Windows: «cross-env NODE_ENV = development». Сначала необходимо установить cross-env: «npm install cross-env --save». Имейте это в сценарии в вашем package.json, и вы можете использовать обе платформы.
Антонио Брандао
6
Не работал для меня Я выполнил export NODE_ENV=developmentна своем терминале Mac, прежде чем делать react-native run-iosс того же терминала. При отладке значение process.env.NODE_ENVне определено.
Эш
58

чаевые

в package.json:

"scripts": {
  "start": "set NODE_ENV=dev && node app.js"
 }

в app.js:

console.log(process.env.NODE_ENV) // dev
console.log(process.env.NODE_ENV === 'dev') // false
console.log(process.env.NODE_ENV.length) // 4 (including a space at the end) 

Итак, это может быть лучше:

"start": "set NODE_ENV=dev&& node app.js"

или

console.log(process.env.NODE_ENV.trim() === 'dev') // true
kenberkeley
источник
2
То, что вы можете сделать, это, так что вам не нужно обрезать:"start": "set NODE_ENV=dev&& node app.js"
З. Хулла
Отличное наблюдение, console.log(process.env.NODE_ENV.length) // 4 (включая пробел в конце)
gregn3
1
Это безопаснее: console.log(('' + process.env.NODE_ENV).trim() === 'dev') // trueне выдает ошибку, даже если process.env.NODE_ENV не определен.
gregn3
52

Для людей, использующих * nix (Linux, OS X и т. Д.), Нет причин делать это с помощью второй команды экспорта, вы можете связать ее как часть вызывающей команды:

NODE_ENV=development node server.js

Проще нет? :)

mlaccetti
источник
3
Пакет, такой как cross-env, позволит работать и на Windows.
Walkerrandophsmith
35

Мы столкнулись с этой проблемой при работе с узлом в Windows.

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

var environment = process.env.NODE_ENV || 'development';

В производственной среде мы определяем его обычными методами (SET / export).

Иаков
источник
3
Это самое прагматичное решение.
druskacik
12

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

В корне проекта запустите:

npm install cross-env

Затем в вашем package.json под скриптами добавьте:

"start": "cross-env NODE_ENV=dev node your-app-name.js"

Затем в своем терминале, в корне проекта, запустите ваше приложение, выполнив:

npm start

Переменная окружения будет доступна в вашем приложении как process.env.NODE_ENV, так что вы можете сделать что-то вроде:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}
Лиран Х
источник
Я не думаю, что это работает. Попробовал это в моем текущем проекте, и NODE_ENV все еще не определено. Это может понадобиться больше конфигурации, чтобы работать, кажется.
Аакаш Тхакур
npm install --save-dev cross-env
DalSoft
9

в файле package.json необходимо выполнить настройку, как показано ниже (работает в Linux и Mac OS)

важная вещь - "export NODE_ENV = production" после того, как ваши команды сборки приведены ниже:

  "scripts": {
     "start": "export NODE_ENV=production && npm run build && npm run start-server",
     "dev": "export NODE_ENV=dev && npm run build && npm run start-server",
  } 
  • для среды разработки нужно нажать команду «npm run dev»

  • для производственной среды мы должны нажать команду «npm run start»

Д.В. Йогеш
источник
9

В macOS для тех, кто использует экспресс-версию 4.x.xи использует DOTENVплагин, необходимо использовать так:

  1. После установки плагина импортируйте как в файле, где вы запускаете приложение, следующим образом: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. В корневом каталоге создайте файл «.env» и добавьте переменную, например:

    NODE_ENV=development или NODE_ENV = development

NRP
источник
6

В UBUNTU используют:

$ export NODE_ENV = тест

Гилберт Фламино
источник
1

Это связано с ОС

В вашем package.json убедитесь, что у вас есть свои скрипты (где app.js - ваш основной js-файл, который нужно выполнить, а NODE_ENV объявлен в .env-файле). Например:

"scripts": {
    "start": "node app.js",
    "dev": "nodemon server.js",
    "prod": "NODE_ENV=production & nodemon app.js"
  }

Для окон

Также настройте свою переменную файла .env, имеющую NODE_ENV = development

Если ваш файл .env находится в папке, например, в папке eg.config, обязательно укажите в app.js (ваш основной файл js)

const dotenv = требовать ('dotenv'); dotenv.config ({путь: './config/config.env'});

Адриан Алмейда
источник
0

Если вы столкнулись с этой проблемой в React, вам нужно response-scripts@0.2.3 и выше. Также для других переменных среды, кроме NODE_ENVработы в React, они должны иметь префикс REACT_APP_.

Даниил
источник
0

Как можно раньше в вашем приложении, требуйте и настраивайте dotenv.

require('dotenv').config()

Хушвант кодеча
источник
-3

Вы также можете установить его по коду, например:

process.env.NODE_ENV = 'test';

joaquindev
источник
67
Я СИЛЬНО отговариваю любого от изменения идентификатора среды в логике приложения. Вы никогда не хотите, чтобы приложение вдруг подумало, что это нечто иное, чем оно есть на самом деле. Это должно быть когда-либо изменено только на системном уровне, как предлагают многие другие ответы.
Кафосо
7
Возможно, вы захотите прочитать о 12 факторных приложениях: 12factor.net/config . Этот код будет нарушением этого. Есть веские причины держать ваш конфиг отдельно от вашего кода.
17
1
Это может быть полезно только для автоматического тестирования, но даже в этом случае его можно абстрагировать и внедрить в ваш основной код, а не читать непосредственно из env.
Ангелос Пикулас
Давайте не будем так сильно опускать этот ответ, чтобы информативный комментарий @Kafoso уменьшился. Или добавьте эту информацию в какой-нибудь голосующий ответ.
Vibhor Dube