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


170

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


установить 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

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

Проще нет? :)


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



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_.



-3

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

process.env.NODE_ENV = 'test';


67
Я СИЛЬНО отговариваю любого от изменения идентификатора среды в логике приложения. Вы никогда не хотите, чтобы приложение вдруг подумало, что это нечто иное, чем оно есть на самом деле. Это должно быть когда-либо изменено только на системном уровне, как предлагают многие другие ответы.
Кафосо

7
Возможно, вы захотите прочитать о 12 факторных приложениях: 12factor.net/config . Этот код будет нарушением этого. Есть веские причины держать ваш конфиг отдельно от вашего кода.
17

1
Это может быть полезно только для автоматического тестирования, но даже в этом случае его можно абстрагировать и внедрить в ваш основной код, а не читать непосредственно из env.
Ангелос Пикулас

Давайте не будем так сильно опускать этот ответ, чтобы информативный комментарий @Kafoso уменьшился. Или добавьте эту информацию в какой-нибудь голосующий ответ.
Vibhor Dube
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.