Как написать готовую к производству программу Node and Express

kak napisat gotovuyu k proizvodstvu programmu node and

Структурирование проекта

Когда я начал создавать программы Node & Express, я не знал, насколько важно структурировать вашу программу. Express не имеет строгих правил или указаний по поддержке структуры проекта.

Вы можете использовать любую структуру, которую вы хотите. Когда ваша кодовая база разрастается, у вас истекает долго route обработчики. Это затрудняет понимание кода и содержит потенциальные ошибки.

Если вы работаете на стартап, в большинстве случаев у вас не будет времени переделать свой проект или модулировать его. Вы можете получить бесконечный цикл исправления ошибок и исправления.

Со временем, работая как с небольшими, так и большими командами, я понял, какая структура может развиваться вместе с вашим проектом и при этом ее легко поддерживать.

Контроллер просмотра модели

Шаблон 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
  • контроллеры: Определите обработчики маршрутов приложения и бизнес-логику
  • использование: Записывает здесь вспомогательные/вспомогательные функции, которые могут использовать любые контроллеры. Например, вы можете написать функцию, как mergeTwoArrays(arr1, arr2).
  • промежуточное программное обеспечение: Вы можете написать промежуточное программное обеспечение для интерпретации всех входящих запросов перед переходом к обработчику маршрута. Например,
    router.post('/login', auth, controller.login) где auth это функция промежуточного программного обеспечения, определенная в middlewares/auth.js.
  • модели: также своего рода промежуточное программное обеспечение между вашим контроллером и базой данных. Вы можете определить схему и выполнить проверку перед записью в базу данных. Например, вы можете использовать ORM, как Mongoose, который имеет отличные функции и методы для использования в самой схеме
  • маршруты: Определите маршруты приложений с помощью методов 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(next) в конце цепочки обещаний. Например:

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 методов, поэтому используйте асинхронные в производстве.

Но если вы все еще хотите использовать синхронный API, используйте --trace-sync-io флаг командной строки. Он будет печатать предупреждение и трассировку стека каждый раз, когда приложение использует синхронный API.

Подробнее об основах обработки ошибок см.

То, что вы должны нет делать это слушать uncaughtException создаваемое событие, когда исключение появляется на весь путь назад к циклу событий. Использовать его, как правило, не желательно.

Правильно вести журнал

Ведение журнала необходимо для отладки и деятельности приложений. Используется в основном для развития. Мы используем console.log и console.error но это синхронные функции.

Для целей отладки

Вы можете использовать такой модуль, как debug. Этот модуль позволяет использовать переменную среды DEBUG, чтобы контролировать, куда отправляются сообщения отладки console.err()если какой-то.

Для активности в приложениях

Один из способов – записать их в базу данных.

Проверьте, как я использовал mongoose плагины для аудита своей программы.

Другой способ – запись в файл ИЛИ используйте библиотеку журналов, таких как Winston или Bunyan. Для детального сравнения этих двух библиотек см. сообщение в блоге StrongLoop «Сравнение журналов 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 значение “production”

The NODE_ENV Переменная среды определяет среду, в которой работает программа (обычно разработка или производство). Одной из самых простых вещей, которые вы можете сделать для повышения производительности, является настройка NODE_ENVк «производству».

Настройка NODE_ENV к «производство” делает Экспресс:

  • Шаблоны просмотра кэша.
  • Кэширование файлов CSS, созданных из расширений CSS.
  • Генерируйте менее подробные сообщения об ошибках.

Тесты показывают, что только это может повысить производительность программы в три раза!

Использование диспетчера процессов

Для производства вы не должны просто использовать node app.j — если ваша программа аварийно завершает работу, она будет офлайн, пока вы ее не перезагрузите.

Самыми популярными менеджерами процессов для Node являются:

Я лично пользуюсь PM2.

Для сравнения функций по функциям трех менеджеров процессов, см. подробнее ознакомление со всеми тремя в разделе Менеджеры процессов для программ Express.

Запустите программу в кластере

В многоядерной системе можно многократно увеличить производительность программы Node, запустив кластер процессов.

Кластер запускает несколько экземпляров программы, в идеале один экземпляр на каждом ядре ЦБ. Это распределяет нагрузку и задачи между инстанциями.

Использование кластерного модуля Node

Кластеризация стала возможна с помощью кластерного модуля Node. Это позволяет главному процессу порождать рабочие процессы. Он распределяет входящие соединения между работниками.

Однако вместо того, чтобы использовать этот модуль напрямую, гораздо лучше использовать один из многих инструментов, делающих это за вас автоматически. К примеру, node-pm или 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 года.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *