process.env.NODE_ENV не визначено


168

Я намагаюся дотримуватися підручника з NodeJs. Я не думаю, що я нічого не пропустив, але кожен раз, коли я називаю process.env.NODE_ENVєдине значення, яке я повертаю, є невизначеним. Згідно з моїм дослідженням, типовим значенням має бути «розвиток». Як динамічно задається це значення і де воно встановлюється спочатку?


щоб встановити NODE_ENV для heroku додатків, ви можете використовувати:heroku config:set NODE_ENV="production"
Connor Leech

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 = розробка та зберегти.
stonyau

6
Якщо хтось бореться ... є різниця між "SET V = VAL" і "SET V = VAL". Простори мають значення.
willem

4
Зауважте, що модуль "cross-env" робить подібне до вищезазначеного, і він буде працювати як на OSX, так і на Windows: "cross-env NODE_ENV = development". Спочатку потрібно встановити cross-env: "npm install cross-env --save". Майте це у сценарії у своєму пакеті.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

Ви можете використовувати пакет cross-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)

найважливіше - "експортувати NODE_ENV = виробництво" після того, як ваші команди збірки нижче є прикладом:

  "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

Це пов’язано з ОС

У своєму пакет.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 = розробка

Якщо ваш .env файл знаходиться в папці для папки eg.config, обов'язково вкажіть у app.js (ваш головний js-файл)

const dotenv = вимагати ('dotenv'); dotenv.config ({шлях: './config/config.env'});


0

Якщо ви стикалися з цією проблемою в React, вам потрібні react-scripts@0.2.3 та новіші версії. Також для інших змінних середовищ, ніж NODE_ENVдля роботи в React, їх потрібно встановити з префіксом REACT_APP_.


0

Як можна раніше у вашій програмі вимагайте та налаштуйте dotenv.

require('dotenv').config()


-3

Ви також можете встановити його за кодом, наприклад:

process.env.NODE_ENV = 'test';


67
Я НАЙКРАЩО відвертаю когось від будь-коли змінити ідентифікатор середовища в логіці програми. Ніколи не хочеться, щоб програма раптом подумала, що це щось інше, ніж є насправді. Це слід коли-небудь змінювати лише на системному рівні, як підказує багато інших відповідей.
Кафосо

7
Ви можете прочитати про 12-факторних додатках: 12factor.net/config . Цей код буде порушенням цього. Є вагомі причини, щоб ваш конфігурація була окремо від вашого коду.
jcollum

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

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