Шаблон серверного NodeJS приложения.
Реализовано:
- NodeJS + Express кластер
- Обработка ошибок
- Настроен linter
- Добавлено окружения для написания тестов
- Добавлен базовый функционал для логирования
Для распараллеливания серверного приложения в рамках одного сервера используется модуль cluster.
В основе сервера лежит framework ExpressJS.
За генерацию клиентского приложения отвечает шаблонизатор EJS. Представления для шаблонизатора расположены в папке frontend/views
.
За разбор куки из запроса отвечает middleware cookie-parser.
Разбор параметров из тела запроса - middleware body-parser.
Статику ExpressJS сервер отдает из папки frontend
.
За маршрутизацию отвечает модуль server/router
. В директории server/router/routes
располагаются маршруты.
Количество запускаемых копий приложения в рамках одного сервера можно ограничить указав значение для переменной окружения CPU_ALLOWED_QTY (подробнее - в разделе Переменные окружения).
Для защиты приложения от некоторых широкоиспользуемых веб-уязвимостей используется модуль helmet. С дополнительными способами защиты можно познакомиться в статьях Production Best Practices: Security, nodesecurity.io Tools, 9 Security Tips to Keep Express from Getting Pwned
Проверка кода на наличие уязвимостей может быть выполнена командой
$ npm run security-check
- Модуль cluster
- Framework ExpressJS
- Шаблонизатор EJS
- Middleware cookie-parser
- Middleware body-parser
- Middleware helmet
- Production Best Practices: Security
- nodesecurity.io Tools
- 9 Security Tips to Keep Express from Getting Pwned
В качестве стандарта оформления программного кода используются правила от Airbnb (Airbnb JavaScript в переводе Леонида Лебедева). Кроме указанных выше правил применяются правила ESLint и предотвращающие написание уязвимого кода правила Node Security
Для проверки оформления программного кода на соответствие стандарту добавлен механизм:
- проверка кода отельной командой:
$ npm run lint
- автоматическое исправление оформления кода (если это возможно или "Но это не точно!" :) ):
$ npm run lint-fix
- проверка перед запуском:
$ npm start
- Используется linter ESLint
- Правила оформления кода Airbnb и правила ESLint. С руководством Airbnb на русском языке можно ознакомиться по ссылке Airbnb JavaScript в переводе Леонида Лебедева.
- npm-пакет, который применяет правила Airbnb в ESLint eslint-config-airbnb-base
- Правила Node Security
Для логирования используется обертка модуля winston ссылка.
Обертка определена в модуле проекта server/utils/log
.
Добавлены три транспорта:
- Консоль - ввыодит сообщения в стандартный поток вывода
- Файл - выводит сообщения в файл (по умолчанию
server/server.log
) - MongoDB - выводит сообщения в базу данных MongoDB (по умолчанию в
mongodb://localhost:27017/log
, коллекциюlogs
)
Настройки логирования (путь к файлу, строка подключения, имя коллекции) задаются в файле server/config/configs/log.config.js
или при помощи переменных окружения, которые описаны в разделе Переменные окружения
Модуль log
определен как глобальный, поэтому он доступен в любом файле серверного приложения. Подключение модуля командой require
необязательно.
Примеры использования:
log.info('log message');
// > "2018.02.28 11:51:54.411 - info: log message"
log.info('log message', 'with additional params');
// > "2018.02.28 11:51:03.093 - info: log message with additional params"
log.info('info message', { author: 'Ni40lay' });
// > "2018.02.28 11:48:05.834 - info: info message author=Ni40lay"
log.info('info message', { author: 'Ni40lay' }, { a: 10 });
// > "2018.02.28 11:58:51.063 - info: info message { author: 'Ni40lay' } a=10"
log.warn('warning message');
// > "2018.02.28 11:52:34.454 - warn: warning message"
log.error('error message');
// > "2018.02.28 11:54:16.954 - error: error message"
В качестве второго (и последующих) параметра в методы вывода сообщений кроме строк можно передавать и объекты.
Характерным примером выступает случай логирования ошибок:
const error = new Error('Some error');
log.error('error message', error);
Вывод в консоль будет похожим на:
2018.02.28 11:54:16.946 - error: error message Error: some error
at Object.<anonymous> (/home/igor/Projects/ERI/blank-server/server/index.js:3:28)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:390:7)
at startup (bootstrap_node.js:150:9)
at bootstrap_node.js:505:3
Используются в server/config/configs/server.config.js
- SERVER_HOST - хост серверного приложения (по умолчанию
'127.0.0.1'
) - SERVER_PORT - порт, на котором запускается серверное приложение (по умолчанию
3000
) - CPU_ALLOWED_QTY - максимальное количество запускаемы копий приложения. Если не указано, то колическтво копий будет равно количеству ядер/потоков процессора сервера. Если указано значение выше, чем количество потоков/ядер, то количество копий будет равно количеству потоков/ядер (по умолчанию
false
, т.е., не указано).
Используются в server/config/configs/log.config.js
- MONGO_LOG_CONNECTION_STRING - строка подключения к базе данных MongoDB, в которой планируется сохранять записи лога (по умолчанию
'mongodb://localhost:27017/log'
). Переменная используется транспортомMongoDBTransport
модуляlog
. - MONGO_LOG_COLLECTION_NAME - имя коллекции, хранящей записи лога (по умолчанию
logs
). Переменная используется транспортомMongoDBTransport
модуляlog
. - FILE_LOG_PATH - абсолютный путь к файлу хранения записей лога (по умолчанию
<path to the project>/server/server.log
). Переменная используется транспортомFileTransport
модуляlog
.