Убедитесь, что мой экземпляр node.js - dev или production
Прямо сейчас, когда я хочу развернуть сервер node.js на моем рабочем сервере, мне нужно изменить все IP/DNS/имя пользователя/пароль для моего различного подключения к моим базам данных и внешним API.
Этот процесс вызывает раздражение, есть ли способ проверить, работает ли текущий исполняемый экземпляр node.js в cloud9ide или на самом деле мой интеллектуальный smartmachine для производства?
Если я могу раскрыть (в моем рабочем коде), на каком сервере запущен мой экземпляр node.js, я добавлю условие, которое устанавливает значения для prod или dev.
Спасибо
Ответы
Ответ 1
Обычно вы должны запускать приложение node в производстве следующим образом:
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);
Ресурсы
Как вы обнаруживаете среду в приложении express.js?
Ответ 2
Я думаю, что самый простой способ установить среду - передать аргумент командной строки вашему приложению.
node ./server.js dev
В вашем script вам необходимо обработать этот аргумент и настроить конфигурацию, что вам нужно.
var env = process.argv[2] || 'dev';
switch (env) {
case 'dev':
// Setup development config
break;
case 'prod':
// Setup production config
break;
}
Кроме того, я был создан модуль, что упрощает процесс настройки. Возможно, это поможет вам.
Ответ 3
На самом деле, я бы не рекомендовал хранить значения конфигурации, такие как информация о подключении к базе данных, пароли, токены доступа и т.д. внутри фактического кода приложения по следующим причинам:
-
Hardcoding эти значения затрудняют их изменение позже. Вам нужно будет опубликовать новую версию приложения, чтобы изменить эти значения.
-
Это серьезное нарушение безопасности, поскольку данные конфигурации и пароли производственного класса не должны храниться в коде. Очень легко протекать эти конфиденциальные данные.
Лучшим подходом было бы экстернализировать эти данные и передать их вашему приложению во время выполнения. Обычно это делается с помощью переменных среды. Вам просто нужно определить уникальную переменную среды для каждого мира данных, который должен быть изменен между различными средами.
Например: 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 позволяет сделать это из коробки.
В среде разработки он упрощается, потому что вы можете использовать очень удобный 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
.