2012-05-22 1 views
29

Прямо сейчас, когда я хочу развернуть сервер node.js на моем рабочем сервере, мне нужно изменить все IP/DNS/имя пользователя/пароль для моего различного подключения к мои базы данных и внешние API.Убедитесь, что мой экземпляр node.js является dev или production

Этот процесс вызывает раздражение, есть ли способ проверить, находится ли текущий экземпляр node.js в cloud9ide или на самом деле мой интеллектуальный smartmachine для производства?

Если я могу удалить (в моем рабочем коде), на каком сервере запущен экземпляр node.js, я добавлю условие, которое устанавливает значения для prod или dev.

Спасибо

+0

Является ли ваш node.js приложением HTTP-сервера? –

+0

Да, это так. Также имеет соединение с mongodb. – guiomie

ответ

44

Обычно вы должны запустить приложение узла в производстве, как это:

NODE_ENV=production node app.js

приложений с помощью Express, Socket.io и другого использования process.env.NODE_ENV, чтобы выяснить обстановку.

В разработке вы можете опустить это и просто запустить приложение, как правило, с помощью node app.js.

Вы можете обнаружить окружающую среду в вашем коде, как это:

var env = process.env.NODE_ENV || 'dev'; 
loadConfigFile(env + '.json', doStuff); 

Ресурсы:

How do you detect the environment in an express.js app?

+3

В Express 3.x и 4.x переменная env устанавливается выражением (здесь) (https://github.com/visionmedia/express/blob/master/lib/application.js#L52) на 'development '. – Ryley

9

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

node ./server.js dev 

В вашем скрипте вам необходимо обработать этот аргумент и настроить конфигурацию, в которой вы нуждаетесь.

var env = process.argv[2] || 'dev'; 
switch (env) { 
    case 'dev': 
     // Setup development config 
     break; 
    case 'prod': 
     // Setup production config 
     break; 
} 

Кроме того, я был создан module, что делает процесс настройки немного проще. Может быть, это поможет вам.

+1

+1 Это позволяет создавать несколько настроек, от разработчика до стадии производства. –

2

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

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

  2. Это серьезное нарушение безопасности, поскольку данные конфигурации и пароли производственного класса не должны храниться в коде. Очень легко протекать эти конфиденциальные данные.

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

Например: DB_HOST, DB_USER, DB_PASSWORD.Тогда вы могли бы передать эти ценности вам приложение в производстве так:

$ NODE_ENV=production DB_HOST=1.2.3.4 DB_USER=someusername DB_PASSWORD=somerandompassword /bin/node app.js 

На самом деле, это значение может быть зашифрованы и добавляемый к кодовому, а затем расшифрованному во время развертывания. Однако убедитесь, что ключ дешифрования надежно хранится в системе развертывания или предоставляется интерактивно инженером по выпуску. Shippable allows to do this из коробки.

В среде разработки это становится проще, потому что вы можете использовать очень удобный dotenv module. Просто создайте .env файл в корневом каталоге вашего проекта и добавить все переменные к нему:

DB_HOST=1.2.3.4 
DB_USER=someusername 
DB_PASSWORD=somerandompassword 

Но, убедитесь, чтобы исключить его из вас VCS, потому что каждый разработчик, вероятно, хотел бы иметь персональную конфигурацию. Вы можете создать файл .env.dist, который будет содержать конфигурацию по умолчанию, которую позже можно было бы использовать в качестве шаблона: cp .env.dist .env.


Кроме того, я реализовал многоразовый модуль, который позволяет автоматически определять среду, анализируя как CLI аргументы и переменную NODE_ENV. Это может быть полезно на вашей машине разработки, потому что вы можете легко изменить среду, передав аргумент CLI вашей программе Node.js следующим образом: $ node app.js --prod. Это также приятно использовать с Gulp: $ gulp build --prod.

Подробнее см. Более подробную информацию и варианты использования на detect-environment's page.

Смежные вопросы