Автор оригинала: FreeCodeCamp Community Member.
Структурирование проекта
Когда я начал строить приложения узла и экспресс, я не знал, насколько важно структурировать ваше приложение. Экспресс не имеет строгих правил или руководящих принципов для поддержания структуры проекта.
Вы можете использовать любую структуру, которую вы хотите. Когда ваша кодовая база растет, вы в конечном итоге имеют длинные Маршрут
обработчики. Это делает ваш код трудно понять, и он содержит потенциальные ошибки.
Если вы работаете на стартапе, большую часть времени у вас не будет времени, чтобы преследовать свой проект или модулировать его. Вы можете в конечном итоге с бесконечной петлем исправления ошибок и исправлению.
Со временем, работая как с небольшими командами, так и большими командами, я понял, какая структура может расти с вашим проектом и все же быть легко поддерживать.
Модель просмотра контроллера
MVC Узор помогает в быстром и параллельном развитии. Например, один разработчик может работать по мнению, а другой может работать над созданием бизнес-логики в контроллере.
Давайте посмотрим на пример простого пользовательского приложения Crud.
project/ controllers/ users.js util/ plugin.js middlewares/ auth.js models/ user.js routes/ user.js router.js public/ js/ css/ img/ views/ users/ index.jade tests/ users/ create-user-test.js update-user-test.js get-user-test.js .gitignore app.js package.json
- Контроллеры: Определите обработчики маршрута приложений и бизнес-логику
- Util: Записывает полезность/хелперные функции здесь, которые могут использоваться любыми контроллерами. Например, вы можете написать функцию, как
MergetwoArrays (Arr1, Arr2)
Отказ - Подразделение: Вы можете писать Indithwares, чтобы интерпретировать все входящие запросы, прежде чем перейти к обработчику маршрута. Например,
Router.post ('/login', auth, controller.login)
гдеauth
Это функция промежуточного программного обеспечения, определенная вHiddrwares/auth.js
Отказ - Модели: Также своего рода промежуточное программное обеспечение между вашим контроллером и базой данных. Вы можете определить схему и сделать некоторую проверку перед записью в базу данных. Например, вы можете использовать ORM, как Мангуст который поставляется с большими функциями и методами для использования в самой схеме
- Маршруты: Определите свои прикладные маршруты, с помощью HTTP-методов. Например, вы можете определить все, что связано с пользователем.
router.post('/users/create', controller.create) router.put('/users/:userId', controller.update) router.get('/users', controller.getAll)
- Общественность: Храните статические изображения в
/IMG
пользовательские файлы JavaScript и CSS/CSS.
- Просмотров: Содержит шаблоны для отображения сервером.
- Тесты: Здесь вы можете написать все тесты или приемочные тесты для API-сервера.
- app.js: Выступает в качестве основного файла проекта, где вы инициализируете приложение и другие элементы проекта.
- Package.json: Заботится о зависимостях, скриптам бежать с
NPM
Команда и версия вашего проекта.
Исключения и обработка ошибок
Это один из самых важных аспектов, которые нужно подумать при создании любого проекта с любым языком. Давайте посмотрим, как изящно обрабатывать ошибки и исключения в приложении Express.
Используя обещания
Одним из преимуществ использования обещаний по обратным вызовам является они могут обрабатывать неявные или явные исключения/ошибки в асинхронных блоках кода, а также для синхронного кода, определенного в .then ()
обратный вызов обещания
Просто добавьте .catch (следующий)
в конце цепочки обещания. Например:
router.post('/create', (req, res, next) => { User.create(req.body) // function to store user data in db .then(result => { // do something with result return result }) .then(user => res.json(user)) .catch(next) })
Использование try-catch
Try-Catch – это традиционный способ ловить исключения в асинхронном коде.
Давайте посмотрим на пример с возможностью получения исключения:
router.get('/search', (req, res) => { setImmediate(() => { const jsonStr = req.query.params try { const jsonObj = JSON.parse(jsonStr) res.send('Success') } catch (e) { res.status(400).send('Invalid JSON string') } }) })
Избегайте использования синхронного кода
Синхронный код также известен как код блокировки, потому что он блокирует выполнение, пока они не будут выполнены.
Поэтому избегайте использования синхронных функций или методов, которые могут принимать миллисекунды или микросекунды. Для веб-сайта высокого движения он будет составлять и может привести к высокой задержению или времени отклика запросов API.
Не используйте их в производстве особенно:)
Многие модули Node.js поставляются с обоими .sync
и .async
Методы, поэтому используйте Async в производстве.
Но, если вы все еще хотите использовать синхронное использование API ITRACE-SYNC-IO
Флаг командной строки. Он будет распечатать предупреждение и след стека всякий раз, когда ваше приложение использует синхронный API.
Для получения дополнительной информации о основании обработки ошибок, см.:
Регистрация правильно
Регистрация необходима для отладки и активности приложения. Он используется в основном для целей развития. Мы используем console.log
и Console.Error
Но это Синхронные функции Отказ
Для целей отладки
Вы можете использовать модуль, похожий на Отладка Отказ Этот модуль позволяет использовать переменную среды отладки для управления, какие сообщения отладки отправляются на console.err ()
, если есть.
Для APP-активности
Один из способов – написать их в базу данных.
Проверьте Как я использовал плагины Mongoose, чтобы сделать аудит моего приложения Отказ
Другой способ – написать в файл Или Используйте библиотеку журнала, как Уинстон или Буньян Отказ Для подробного сравнения этих двух библиотек см. В блоге FrongLoop Post Сравнение Winston и Bunyan Node.js Регистрация Отказ
требуют (“./../../../../../../”) беспорядок
Для этой проблемы есть разные обходные пути.
Если вы найдете любой модуль, получив популярность, и если он имеет логическую независимость от приложения, вы можете преобразовать его в частный модуль NPM и использовать его как любой другой модуль в Package.json.
ИЛИ ЖЕ
const path = require('path'); const HOMEDIR = path.join(__dirname,'..','..');
где __dirname
Встроенная переменная, которая называет каталог, который содержит текущий файл, и ..
, ..
Предполагается ли необходимое количество расходов вверх по дерево каталога для достижения корня проекта.
Оттуда это просто:
const foo = require(path.join(HOMEDIR,'lib','foo')); const bar = require(path.join(HOMEDIR,'lib','foo','bar'));
загрузить произвольный файл в проекте.
Дайте мне знать в комментарии ниже, если у вас есть лучшие идеи:)
Установить Node_env в «производство»
Node_env Переменная среды определяет среду, в которой работает приложение (обычно, развитие или производство). Одна из самых простых вещей, которые вы можете сделать, чтобы улучшить производительность, – это установить Node_env «Производство».
Настройка Node_env к « производство » делает Express:
- Шаблоны просмотра кэширования.
- Файлы CSHS CSS, созданные из расширений CSS.
- Создайте меньше сообщений об ошибках Verbose.
Тесты указывают Это просто делает это может улучшить производительность приложения в три раза!
Использование процесса менеджера
Для производства вы не должны просто использовать Узел App.j
– Если ваше приложение вылетает, он будет в автономном режиме, пока не перезапустите его.
Самые популярные технологические менеджеры для узла:
Я лично использую PM2.
Для сравнения функций функции трех менеджеров по процессам см. http://strong-pm.io/compare/ Отказ Для более подробного введения во все три, см. Менеджеры процессов для Express Apps Отказ
Запустите свое приложение в кластере
В многоядерной системе вы можете увеличить производительность приложения узла, запустив кластер процессов.
Кластер запускает несколько экземпляров приложения, в идеале один экземпляр в каждом ядре CPU. Это распределяет нагрузку и задачи среди экземпляров.
Использование кластерного модуля узла
Кластеризация производится с узлом модуль кластера Отказ Это позволяет основным процессом создавать рабочие процессы. Распределяет входящие связи между рабочими.
Однако, вместо того, чтобы использовать этот модуль напрямую, намного лучше использовать один из множества инструментов, которые сделают это для вас автоматически. Например Узел-вечера или Cluster-Service Отказ
Используя PM2.
Для PM2 вы можете использовать кластер напрямую через команду. Например,
# Start 4 worker processes pm2 start app.js -i 4 # Auto-detect number of available CPUs and start that many worker processes pm2 start app.js -i max
Если вы столкнулись с любыми проблемами, не стесняйтесь получить коснуться или комментировать ниже. Я был бы рад помочь:)
Не стесняйтесь хлопать, если вы считаете это стоящим чтением!
Ссылки: https://expressjs.com/en/advanced/best-practice-performance.html.
Первоначально опубликовано 101node.io 30 сентября 2018 года.