Що таке NODE_ENV і як ним користуватися в Express?


184

Це моя програма, я зараз працюю над виробництвом.

var app = express();
app.set('views',settings.c.WEB_PATH + '/public/templates');
app.set('view engine','ejs');
app.configure(function(){
    app.use(express.favicon());
    app.use(express.static(settings.c.WEB_PATH + '/public'));
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.methodOverride());
    app.use(express.session({
            cookie:{ domain:"."+settings.c.SITE_DOMAIN, maxAge:1440009999},
            secret:'hamster',
            store: r_store,
            }));
    app.use(useragent.express());
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
});

Однак я дізнався про це NODE_ENVі хочу ним скористатися. Як я можу це зробити?


У вашому випадку я припускаю, що ви можете використовувати, app.configure('development', ...)або "виробництво", щоб встановити певні настройки лише для середовищ розробки або виробництва. Дивіться expressjs.com/api.html#app.configure
Андреас Хультгрен

Відповіді:


360

NODE_ENVце змінна середовище, популярна в рамках експрес- веб-сервера. Коли запускається додаток вузла, він може перевіряти значення змінної середовища та робити різні речі на основі значення. NODE_ENVконкретно використовується (за умовами) для визначення того, чи є певне середовище виробничим чи розвивальним середовищем. Загальним випадком використання є запущення додаткового коду налагодження або журналу, якщо він працює в середовищі розробки.

Доступ до NODE_ENV

Ви можете використовувати наступний код для доступу до змінної оточуючого середовища, щоб ви могли виконувати власні перевірки та логіку:

var environment = process.env.NODE_ENV

Або ж використовувати експрес " app.get('env')( зверніть увагу: це за замовчуванням "development")

Майте на увазі, що якщо ви прямо не налаштувались NODE_ENVна своє оточення, так і буде undefined.

Встановлення NODE_ENV

Насправді встановлення змінної середовища залежить від операційної системи до операційної системи, а також залежить від налаштувань користувача.

Якщо ви хочете встановити змінну середовища як разову, це можна зробити з командного рядка:

  • linux та mac :export NODE_ENV=production
  • вікна :$env:NODE_ENV = 'production'

У довгостроковій перспективі ви повинні наполягати на цьому, щоб воно не втрачалось, якщо ви перезавантажуєтесь, - а не перелічуйте всі можливі методи для цього, я дозволяю вам шукати, як це зробити самостійно!

Конвенція dictacted , що є тільки два значення , які слід використовувати для NODE_ENV, або productionчи development, малих літер. Ніщо не заважає вам додавати більше значень, але це, мабуть, не дуже гарна ідея, оскільки я бачу багато такого типу коду у багатьох використовуваних ним модулях node_:

var development = process.env.NODE_ENV !== 'production';

Зверніть увагу , що це дійсно погана ідея , щоб спробувати встановити NODE_ENVз всередині самого додатка вузла - якщо ви робите це буде застосовуватися тільки до процесу , з якого він був встановлений , так що речі , ймовірно , не працюватиме , як ви очікуєте їх. Не робіть цього - ви пошкодуєте.


5
У Експресі 4 app.configure()було видалено. Посібник з міграції Express 4 рекомендує "використовувати process.env.NODE_ENVабо app.get('env')виявляти навколишнє середовище та конфігурувати додаток відповідно".
Кріс Бартлі

3
Я думаю, що найкраще використовувати app.get ('env'), тому що якщо середовище не визначене, вузол за замовчуванням dev, де як тільки перевірка змінної ви самі
надаєте

11
Хороший момент - я додав примітку, щоб виділити за замовчуванням. Однак моє особисте відчуття полягає в тому, що ти не повинен використовувати app.get('env')саме з цієї причини. Це свідчить про те, що ця важлива змінна не встановлена ​​- що робить речі невідповідними, коли ви отримуєте доступ до неї поза експресом. Крім того, я вважаю, що шкідливим є те, що код налагодження випадково не працює в середовищі розробки, ніж шкідливо, ніж випадково запускати його у виробничому середовищі.
Ед Гінчліфф

5
Я вимірював ефекти пропускання налаштування NODE_ENV в експрес-програмах. За замовчуванням developmentце, серед іншого, означає, що шаблони будуть перероблені для кожного запиту. Наслідком цього є збільшення продуктивності або зменшення продуктивності в розмірі ~ 75% між виробництвом та розробкою при використанні Jade. Я також створив допис у блозі на тому apmblog.dynatrace.com/2015/07/22/…
DanielKhan

8
Я думаю, що для експрес-проектів, окрім "виробництва" та "розвитку", вам потрібно хоча б ще один "тест" для запуску автоматизованих тестів. Ви можете використовувати інший БД для заповнених даних тесту.
світанок

19

NODE_ENV - це змінна середовище, яка розшифровується як середовище вузла в експрес-сервері.

Це те, як ми встановлюємо та визначаємо, в якому середовищі ми знаходимося.

Це дуже поширене використання productionта development.

Набір:

export NODE_ENV=production

Отримайте:

Ви можете отримати це за допомогою app.get('env')


11

Я припускаю, що оригінальне питання включало, як Express використовує цю змінну середовища.

Express використовує NODE_ENV для зміни власної поведінки за замовчуванням. Наприклад, в режимі розробки обробник помилок за замовчуванням відправить назад стек-трек до браузера. У режимі виробництва відповідь проста Internal Server Error, щоб уникнути просочування деталей про впровадження у світ.


0

Як правило, ви використовуєте NODE_ENVзмінну для здійснення спеціальних дій при розробці, тестуванні та налагодженні коду. Наприклад, для отримання детальної реєстрації та виводу налагодження, якої ви не хочете у виробництві. Сам Експрес поводиться по-різному залежно від того NODE_ENV, встановлений він productionчи ні. Це можна побачити, якщо ви помістите ці рядки в програму Express, а потім зробите HTTP GET-запит на /error:

app.get('/error', function(req, res) {
  if ('production' !== app.get('env')) {
    console.log("Forcing an error!");
  }
  throw new Error('TestError');
});

app.use(function (req, res, next) {
  res.status(501).send("Error!")
})

Зауважте, що останні app.use()повинні бути останніми після всіх інших обробників методів!

Якщо ви встановите NODE_ENVна productionперед тим, як почати свій сервер, а потім відправити GET /errorзапит на нього, ви не повинні бачити текст Forcing an error!в консолі, і відповідь не повинен містити трасування стека в HTML тіла (який походження від Express). Якщо натомість NODE_ENVперед запуском сервера ви встановите щось інше, то має статися навпаки.

В Linux встановіть змінну середовища NODE_ENV так:

export NODE_ENV = ' значення '

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