Добрый день, дорогой %username%! Сегодня мы будем описывать создание каркаса приложение по типу MVC на Node.js с использованием кластеров, Express.js и mongoose. Задача — поднять сервер который имеет несколько особенностей. Статья написана новичком для новичков. Буду рад любым замечаниям! С чего начать? Установить Node.js (с которым идет npm). Установить MongoDB (+ Добавить в PATH). Теперь создание NPM проекта для того что бы не тащить все зависимости в наш git! Вам предстоит ответить на несколько вопросов (можно пропустить все просто нажимая по Enter-у). Иногда npm багует и записав package.json не завершается. Дальше! Запишем наш index.js Немного про кластеры. Что такое кластер? Кластер это система приложений которые где есть две роли: Главная роль (master) и рабочая роль (worker). Есть один мастер на который приходят все запросы, и n-ое количество рабочих (в коде CPUCount). Если приходит запрос к серверу, то мастер решает какому рабочему дать этот запрос. При создании рабочего node рожает процесс который запускает тот же код, который сейчас запущен и создает IPC. Когда происходит соединение по TCP/IP то мастер отдает Socket одному из рабочих по определенной политике (подробнее здесь) через IPC. Вернемся к коду. Что там случилось с master-ом и worker-ом? Код мастера: Про arrow function, online, disconnect, шаблонные строки Что дальше? Дальше рабочий! Здесь мы будем писать один код. Потом я буду говорить что мы пропустили и добавлять его :) НО перед этим для начала загрузим зависимости из npm! Зачем нам каждый модуль? И так? напишем скрипт для запуска nodemon. В package.json добавим (заменим если есть такой field) Для запуска будем теперь использовать В дальнейшем мы добавим тесты, документацию. Теперь вернемся к Worker-у. Для начала запустим Express! Это все? Нет. На самом деле есть несколько вещей которые мы забыли про настройку Express-а. Исправим это. Нам ведь нужны файлы для лицевой части? (Front-end). Так добавим их поддержку! Создадим папку public все содержание которого будет доступно по адресу /public. У нас есть два варианта. Поставить NGINX и не ставить его. Самый простой вариант не ставить его. Будем использовать то что встроено в express. Альтернативный вариант использовать NGINX в качестве мастера, который еще и будет брать на себя ответственность за статические файлы. Оставим это на какое-то время, хоть и это поможет с производительностью и масштабированием. Перед app.get('/'). Добавим следующее: Это все? ОПЯТЬ НЕТ! Теперь к входным данными. Как мы будем получать входные данные? Теперь к кукам Но это не все! Дальше нам нужно заставить работать Mongoose ибо мы будем работать с сессиями! Запустим MongoDB командой Что же здесь происходит? Мы создаем папку database где будет хранится данные сервера. Не забудьте добавить папку в .gitignore. Затем мы запускаем MongoDB указывая на папку database как хранилище. И что бы файлы были маленькими передаем параметр --smallfiles, хотя даже в таком случае MongoDB будет хранить логи размером 200МБ в папке ./database/journal Также во второй части будет туториал как поднять пропускную способность MongoDB, и установить его как сервис в systemd под Ubuntu. Теперь к коду. В файле worker.js в начало файла сразу после загрузок модулей вставим следующее Создаем файл dbinit.js в папке bin. В который вставляем такой код: Теперь привяжем сессии к датабазе. В bin/worker.js добавим следующее. В начало к загрузке модулей: И после парсера куков: Несколько пояснений насчет очередности подключений. express.static('/public'). Сидит в самом начале т.к. Браузеры отправляют запросы на файлы паралельно и они будут отправлять запросы с пустыми сессиями и мы будем создавать их тысячами. Куки парсер и сессий нужны в начале т.к. в дальнейшем они будут использовать для авторизации. После чего идут парсеры тела запроса. NOTE: Последние два можно поменять местами. Сервис авторизации. Он должен идти после парсеров и сессий т.к. пользуется ими, но перед контроллерами т.к. они используют информацию о пользователе. Далее идут контроллеры, к ним вернемся чуть позже. Теперь обработчик ошибок. Он должен идти последним т.к. в документации Экспресс так написано :) В файле bin/worker.js добавим перед app.listen(.....); следующее Теперь создадим файл errorHandler.js Практически закончили работу с Worker-ом. Но нам еще нужно настроит модели и их загрузку.
Создадим папку models где будут храниться наши модели. В дальнейшем у нас будут еще миграции с помощью которых мы будем мигрировать из одной версии датабазы на новую. Создадим в папке models файлы index.js И user.js. Таким образом в index.js мы запишем загрузку всех моделей и их Экспорт, а файл user.js будет содержать модель из Mongoose-а с некоторыми методами и функциями привязанных к модели. Про модели можно почитать на сайте Mongoose или в документации.
В index.js записываем: А в user.js записываем: Теперь разберемся с образами (Попытка перевести view) и контроллерами. Создадим две папки: controllers и views. Теперь выберем нужную нам библиотеку для рендера (прорисовки, отрисовка, компиляция, заполнение) образов. Для меня крайне простым оказалась mustache. Но для того что бы было легко менять движок рендеринга я использую consolidate. Консолдейт требует что бы движки используемые проектом были установлены, поэтому не забудьте после того как поменяете движок его установить. Теперь вставим заменим весь app.get('/'); на Теперь в папке views добавляем наш index.html куда записаваем Заходим на 127.0.0.1:3000 и видим Hello, World!. Перейдем к контроллерам! Удалим строки app.get(.................). Теперь нам предстоит загрузить контроллеры. (Которые находятся в папке controllers). Вместо нашего удаленного кода вставляем следующее. В файл controllers/index.js записываем  А в файл controllers/home.js записываем: На этом конец первой части! Спасибо за внимание. Многое осталось без нашего внимания, и надо будет это исправить во второй части. Здесь есть много спорных моментов. Так же здесь много ошибок, которые будут исправлены во второй части. Код чуть позже будет выложен на github. Суть проекта объясняется во второй части.