Что такое 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и хочу использовать его. Как я могу это сделать?

TIMEX
источник
В вашем случае я предполагаю, что вы можете использовать app.configure('development', ...)или «производство», чтобы установить определенные параметры только для среды разработки или производства. См. Expressjs.com/api.html#app.configure
Андреас Халтгрен,

Ответы:

360

NODE_ENVэто переменная окружения, ставшая популярной в среде экспресс- веб-сервера. Когда приложение узла запускается, оно может проверять значение переменной среды и выполнять различные действия в зависимости от значения. NODE_ENVспециально используется (по соглашению), чтобы указать, является ли конкретная среда производственной или средой разработки . Распространенным вариантом использования является выполнение дополнительного кода отладки или регистрации, если он выполняется в среде разработки.

Доступ к NODE_ENV

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

var environment = process.env.NODE_ENV

Или, в качестве альтернативы, используйте express ' 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_module, которые я использую:

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

Обратите внимание , что это действительно плохая идея , чтобы попытаться установить NODE_ENVиз внутри самого приложения узла - если вы делаете это будет применяться только к процессу , из которого он был установлен , так что вещи , вероятно , не будет работать , как вы ожидаете их. Не делай этого - ты пожалеешь об этом.

Эд Хинчлифф
источник
5
В Express 4 app.configure()был удален. Руководство по миграции Express 4 рекомендует «использовать process.env.NODE_ENVили app.get('env')обнаруживать среду и настраивать приложение соответствующим образом».
Крис Бартли,
3
Я думаю, что лучше всего использовать app.get ('env'), потому что если среда не определена, то по умолчанию для узла используется значение dev, где при простой проверке переменной
выдается
11
Хороший вопрос - я добавил примечание, чтобы выделить значение по умолчанию. Однако мое личное мнение таково, что вы не должны использовать app.get('env')именно по этой причине. В нем рассказывается, что эта важная переменная не установлена, что делает вещи непоследовательными, когда вы обращаетесь к ней извне экспресса. Более того, я думаю, что менее опасно, что случайно отладочный код не запускается в среде разработки, чем случайно запускать его в производственной среде.
Эд Хинчлифф
5
Я измерил эффекты пропуска установки NODE_ENV в приложениях Express. По умолчанию он, 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 = ' значение '

Rein
источник