Убедитесь, что мой экземпляр 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.