Экспресс в действии (1): обзор

Node.js JavaScript Express

2017-08-13-Cover
2017-08-13-Cover

Прежде чем мы перейдем к материалам Express, необходимо хорошо понять Node.js.

Долгое время JavaScript был языком написания скриптов, запускаемых в браузерах. Однако в последние годы, с развитием Интернета и технического прогресса, JavaScript открыл эру централизованного взрыва. Стандартное событие — рождение Node.js в 2009 году.

Node.js разработан на основе движка Google Chrome V8, который позволяет запускать JavaScript на стороне сервера. Это значительно расширяет сценарии приложений JavaScript и делает полный стек JavaScript горячей темой. Разработчикам больше не нужно изучать языки и фреймворки, такие как Ruby, Python, Java и т. д., и полагаться на JavaScript для выполнения большинства задач разработки интерфейсов и серверов.

Хотя в чем-то JavaScript не идеален и даже имеет некоторые недостатки дизайна, но это не влияет на популярность Nodejs. Высокая вычислительная мощность и стиль асинхронного программирования движка V8 освобождают разработчиков от многопоточности. Среди них можно сказать, что один и тот же технологический стек на переднем и заднем концах является его самым большим убийцей. Все более богатая экологическая среда также заставляет разработчиков все больше и больше интересоваться JavaScript, и разработка с помощью Node.js стала очень модной вещью.

Как и JavaScript в среде браузера, Node.js предоставляет только низкоуровневые интерфейсы и функции, которые в основном необходимы для создания приложений. Эти низкоуровневые интерфейсы обычно многословны и сложны в использовании. Итак, кто-то внедрил фреймворк Express поверх Node.js. Его основная концепция аналогична jQuery, инкапсулируя базовый интерфейс, он упрощает код и обеспечивает интерфейс более высокого уровня. Кроме того, Express также очень масштабируем. Сам фреймворк не имеет никакого отношения к архитектуре и бизнесу программы, а также можно расширять функции через сторонние библиотеки.

Сценарии приложений Node.js

Node.js (часто называемый просто Node) — это платформа для запуска кода JavaScript. Хотя JavaScript в большинстве случаев запускается в браузере, нигде не сказано, что он должен работать только в браузере. Как язык программирования он практически ничем не отличается от Ruby, Python, C++ и PHP. как вы можете использоватьpython myfile.pyдля запуска скрипта Python вы можете использовать node myfile.jsдля выполнения программ JavaScript.

Но каковы преимущества Node, которые мы должны попробовать в серверной разработке?

Во-первых, JavaScript-движок Node.js очень быстрый. В конце концов, он основан на известном быстродействующем движке Google Chrome V8, способном выполнять тысячи инструкций JavaScript в секунду.

Во-вторых, Node.js полностью использует свои возможности параллелизма благодаря парадигме асинхронного программирования.

Аналогия лучше всего подходит для выпечки в реальной жизни. Предположим, что теперь, когда мне нужно испечь кексы, мне нужно сначала правильно приготовить муку. И в этот момент я не мог уйти, чтобы сделать что-нибудь еще. Но как только я поставлю кексы в духовку, я могу уйти и заняться другими делами, не дожидаясь.

В Node.js клиент может отправлять запросы на сервер в любое время. Возможно, пока вы обрабатываете один запрос, другой запрос также обслуживается клиентом. Предположим, что оба запроса требуют доступа к базе данных. Затем вы можете перейти к обработке второго запроса, пока первый запрос выполняет операции с базой данных. Хотя невозможно ответить на оба одновременно, мы можем использовать асинхронный метод, чтобы пропустить ожидание результата трудоемких операций и напрямую обрабатывать последующие запросы. Некоторые другие операционные среды не имеют этой возможности по умолчанию. Например, Ruby on Rails может обрабатывать только один запрос за раз. Если вы хотите увеличить параллелизм программы, вам нужно купить больше серверов.

На следующем рисунке хорошо видна разница между ними:

01_01
01_01

Асинхронная обработка значительно эффективнее синхронной, хотя асинхронный код не является параллельной обработкой.

Конечно, это не значит, что механизмы асинхронной обработки делают Node.js одним из самых быстрых языков в мире. Хотя Node.js может максимизировать производительность одноядерных процессоров, он все же несопоставим с возможностями многоядерных процессоров. Другие языки позволяют использовать многоядерные возможности для одновременного выполнения нескольких задач. Как и раньше с выпечкой: вы можете купить больше духовок, чтобы испечь больше печенья одновременно. Node начинает поддерживать эту возможность, но это не так важно, как в других языках.

Лично выбор Node.js из-за производительности — не самая важная причина, хотя он действительно быстрее, чем Ruby, Python и другие языки сценариев. Основная причина в том, что он использует один и тот же язык для разработки интерфейса и сервера.

Как правило, вы будете использовать JavaScript при написании веб-приложений. Но до появления Node.js интерфейсную и внутреннюю разработку приходилось выполнять на разных языках. Для этого вам нужно изучить несколько языков и фреймворков. С Node.js вы можете использовать один язык для свободного переключения между интерфейсной и внутренней разработкой, что является наиболее привлекательной частью.

Что такое Экспресс?

Express — это сервисная платформа верхнего уровня, инкапсулированная на основе Node.js, которая предоставляет более лаконичный API и более практичные новые функции. Он упрощает организацию программ и управление ими благодаря промежуточному программному обеспечению и маршрутизации, предоставляет богатые инструменты HTTP, упрощает визуализацию динамических представлений и определяет набор расширяемых стандартов.

Особенности Node.js

С помощью простой функции JavaScript вы можете создать веб-приложение с Node.js. Эта функция используется для прослушивания сетевых запросов, инициированных браузерами или другими устройствами. Когда запрос получен, функция анализирует содержимое запроса и соответствующим образом обрабатывает его. Например, когда вы запрашиваете домашнюю страницу сайта, функция узнает вашу цель и отображает HTML-код домашней страницы. Если запрашивается интерфейс API, функция возвращает клиенту соответствующие данные JSON.

Предполагая, что теперь серверу необходимо вернуть пользователю информацию о текущем времени и часовом поясе, программа примерно включает следующие функции:

  • Если клиент делает запрос на домашнюю страницу, веб-приложение вернет HTML-код, содержащий необходимую информацию.
  • Если клиент обращается к неправильному адресу, веб-приложение вернет ошибку HTTP 404 с описанием ошибки.

Если приложение построено непосредственно поверх Node.js без использования Express, полная блок-схема выглядит так:

01_02
01_02

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

Эта функция JavaScript, которая обрабатывает запросы браузера, называется обработчиком запросов. Это также просто функция JavaScript, которая обрабатывает запросы и отвечает, ничего особенного. Служба HTTP Node.js берет на себя сетевое соединение, поэтому вам не нужно беспокоиться и иметь дело со сложными вещами сетевого протокола.

С точки зрения кода эта функция содержит два параметра: один — объект запроса сетевого запроса, а другой — объект ответа, представляющий сетевой ответ. В предыдущем информационном приложении обработчик запроса проверял URL-адрес запроса. Если запрашивается домашняя страница, возвращается страница успешного ответа. В противном случае возвращается ошибка 404. Ни одно приложение Node.js не обрабатывается таким образом: писать функции-обработчики для ответа на запросы очень просто.

Проблема в том, что API Node.js не очень удобен для разработчиков. Например, если мы хотим отправить изображение в формате JPEG, это может занять не менее 45 строк кода. Создание многократно используемых HTML-шаблонов сложнее. Кроме того, HTTP-модуль Node.js, хотя и мощный, по-прежнему лишен некоторых полезных функций.

Express был создан для решения этих проблем, позволяя вам эффективно писать веб-приложения с использованием Node.js.

Что Express дает Node.js?

По большому счету, Express привносит две основные функции в HTTP-модуль Node.js:

  • Сложность программы упрощается за счет предоставления большого количества простых в использовании интерфейсов. Например, чтобы смягчить описанную выше проблему с изображением JPEG, Express может сжать код до одной строки.
  • Это позволяет разделить обработчик запросов и реорганизовать его во множество небольших обработчиков запросов, отвечающих за конкретные запросы. Это облегчает модульность и последующее обслуживание.

По сравнению с приведенным выше рисунком на следующем рисунке показан общий поток запросов на экспресс-обработку:

01_03
01_03

Как и прежде, разработчикам нужно сосредоточиться только на содержании круга.

Хотя диаграмма выглядит сложнее, чем предыдущая, реальная разработка проще, по сути, она в основном делает две вещи:

  1. В отличие от предыдущей функции обработки больших запросов, здесь используется большое количество мелких функций обработки. Некоторые функции выполняются каждый раз (например, логирование запросов), а некоторые функции срабатывают только в определенных ситуациях (например, ошибка 404). Express имеет ряд инструментов, доступных для различения этих обработчиков.
  2. В обработчике запроса есть два параметра: запрос и ответ. HTTP узла может выполнять некоторую базовую обработку, например: получитьuser-agent. Экспресс более мощный, вы можете получить IP-адрес посетителя и проанализировать оптимизированный объект запроса URL. Объект ответа также был улучшен. чем-то вродеsendFileТакая функция сжимает код передачи файла в одну строку. Это значительно упрощает функциональную реализацию функции-обработчика.

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

Философия минимализации Express

Хотя Express является фреймворком, его соглашения о программировании очень гибкие. Вы можете использовать его для написания всевозможных приложений, от видеочата до личных блогов и многого другого. Кроме того, Express сам по себе не является сундуком с сокровищами, и вам может понадобиться использовать большое количество сторонних библиотек классов в реальной разработке. Эти библиотеки могут помочь вам решить некоторые незначительные проблемы, чтобы вы могли сосредоточиться на важных, а затем продвигать Unix.do-one-thing-wellФилософия достижения цели.

Но эта идея минимизации также является палкой о двух концах. С одной стороны, Express очень гибок и надежен и не содержит бесполезного мусорного кода. С другой стороны, эта простота неизбежно приводит к отсутствию некоторых функций по сравнению с другими фреймворками. Это означает дополнительную домашнюю работу по архитектуре программы и время, потраченное на поиск сторонних модулей после возникновения проблем. Из коробки немного хуже.

Некоторые люди предпочитают гибкие и изменяемые фреймы, а другие предпочитают фреймы с фиксированной структурой. PayPal, например, тоже использует Express, но имеет строгие требования к разработчикам. Сам Express не имеет отношения к архитектуре программы, поэтому программисты могут выбирать в соответствии со своими предпочтениями. Поскольку у вас есть абсолютный контроль над программой, как только вы примете неразумное решение, вы будете медленно карабкаться в яму позади.

Никогда не существует фиксированного правильного ответа на все плюсы и минусы больших фреймворков и минималистских фреймворков, поэтому нам не нужно слишком много бороться. Здесь я просто хочу, чтобы вы помнили, что Express — это минималистичный фреймворк.

Ядро экспресса

Express очень чистый и отлично справляется с инкапсуляцией Node.js, и все это проистекает из четырех дизайнов фреймворка.

промежуточное ПО

Как упоминалось ранее, собственный Node.js использует обработчик запросов для всех запросов и ответов.

MiddlewareЭто не очень хорошее название, но этот термин не уникален для Express, скорее, он существует уже давно. Концепция очень проста: вместо одного огромного обработчика запросов мы комбинируем ряд простых обработчиков. Каждая небольшая функция обработки соответствует небольшой задаче, и эти функции обработки называются промежуточным программным обеспечением.

ПО промежуточного слоя может выполнять множество задач, от регистрации запросов до отправки статических файлов и настройки заголовков HTTP. Например, первой промежуточной функцией, используемой в приложении, может быть регистрацияlogger-log. Когда ведение журнала будет завершено, оно перейдет к следующему промежуточному программному обеспечению в цепочке вызовов. И следующей промежуточной функцией может быть аутентификация пользователя. Если разрешения недостаточно, появится сообщение «Не авторизовано». В противном случае продолжите выполнение следующего промежуточного ПО. На этом этапе функция промежуточного программного обеспечения может заключаться в отображении домашней страницы и завершении ответа. Следующие схемы иллюстрируют оба сценария:

01_04
01_04

Как видно на рисунке, промежуточное ПО для логирования стоит первым и обязательно будет выполняться. Далее идет промежуточное ПО, выполняющее аутентификацию авторизации. Если разрешение пользователя удовлетворено, продолжайте выполнение следующего промежуточного программного обеспечения, в противном случае последующее промежуточное программное обеспечение не будет выполнено.

Самая большая особенность промежуточного программного обеспечения заключается в том, что оно является относительно стандартным, а это означает, что разработчики могут расширять его функциональность, разрабатывая промежуточное программное обеспечение для Express. В то же время это может означать, что кем-то может быть разработано какое-то общее промежуточное ПО, такое как: компиляция статических файлов, таких как LESS и SCSS, контроль разрешений, парсинг куков и сессий.

маршрутизация

По сравнению с промежуточным ПО,RoutingЯвно лучше. Подобно средней цене, маршрутизация разделяет функцию обработчика запросов. Разница в том, что маршрутизация обрабатывается на основе запрошенного URL-адреса и метода HTTP.

Например, у вас есть домашняя страница и страница доски объявлений в вашей программе. Когда пользователь использует GET для запроса домашней страницы, Express возвращает соответствующий контент домашней страницы. То же самое касается обработки запросов на доски объявлений. Если пользователь оставляет сообщение на странице доски объявлений с помощью метода POST, маршрутизатору необходимо произвести соответствующую обработку и обновить страницу.

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

Промежуточное ПО и маршрутизация в Express дополняют друг друга. Например: вы можете регистрировать запросы, отвечая на маршрут домашней страницы.

дополнительное приложение

Экспресс-приложения обычно небольшие и могут быть даже одним файлом. По мере масштабирования вашего приложения вы можете разделить его на несколько файлов и папок. Хотя у Express нет четких указаний по масштабу приложения. Но мы можем пройтиsub-applicationsэта важная характеристика. В терминологии Express эти единственные приложения также называютсямаршрутизатор.

путем достижения нормального масштабамаршрутизаторПодприложения, которые могут разделить большое приложение на модули. Вы даже можете выполнить более детальное разделение определенных подприложений. Например, в приложении может быть несколько подмодулей, таких как фон управления, одностраничное приложение, интерфейс API и так далее. На этом этапе вы можете реализовать эти подмодули как подприложение. Подробности следующие:

01_05
01_05

Когда масштаб программы станет больше, преимущества этой возможности постепенно станут заметными.

Простые в использовании функции API

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

Чтобы сделать обработку более эффективной и корректной, Express делает много инкапсуляции на основе нативного Node.js. Сжимая объем кода для повышения эффективности, он также снижает вероятность человеческой ошибки. В дополнение к отправке файлов Express предоставляет возможности рендеринга HTML, недоступные для собственного Node.js. Кроме того, Express проделал большую работу по разбору запросов.

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

Экспресс Экосистема

Как и другие инструменты, например, Express не стоит в стороне от мира.

Он выживает в экосистеме Node.js, поэтому вы можете найти множество сторонних модулей для повышения эффективности разработки, таких как драйверы подключения к базе данных. Поскольку Express чрезвычайно расширяем, во всей экосистеме разработано большое количество библиотек классов для Express.

Чем Express отличается от других фреймворков

Express не первый веб-фреймворк и не последний.

Точно так же Express — не единственная платформа в экосистеме Node.js. Вероятно, его самым большим конкурентом являетсяHapi.js. Подобно Express, он также имеет концепцию маршрутизации и промежуточного программного обеспечения. Но разница в том, что у него нет HTTP-модуля на основе Node.js для обработки сетевых запросов, а есть сетевой модуль, разработанный Walmart. Этот модуль принят Mozilla, OpenTable и NPM и протестирован в реальных программах. Как главный конкурент Express, я подозреваю, что разработчики с обеих сторон могут враждебно относиться друг к другу.

Самый популярный крупный фреймворк в мире Node.js — это Meteor с полным стеком. По сравнению с бесплатным и гибким Express, Metero имеет очень строгую структуру программы. В отличие от Express, который фокусируется только на обработке уровня HTTP, Meteor, как полнофункциональная платформа, может работать как на стороне клиента, так и на стороне сервера. Конечно, это просто выбор дизайна, и на самом деле это не значит, кто лучше.

Подобно упаковке Express, основанной на Node.js, существуют и более продвинутые упаковки для Express. Например, Kraken, созданный PayPal. Хотя с технической точки зрения Kraken — не более чем промежуточное ПО для Express. Тем не менее, он по-прежнему делает много вещей, таких как привязка безопасности промежуточного программного обеспечения. Sails.js — это еще одна новая платформа на основе Express со встроенной базой данных, интеграцией WebSocket, созданием API и многим другим. Все эти фреймворки представляют собой относительно фиксированную реализацию пакета Express.

Одной из основных особенностей Express является промежуточное ПО. Connect — это среда Node.js и промежуточного ПО. Он не обеспечивает маршрутизацию и простые в использовании функциональные интерфейсы. А Express раньше использовал Connect на своем промежуточном уровне. Хотя в настоящее время промежуточное ПО Express устарело, оно всегда было полностью совместимо с промежуточным ПО Connect. Это означает, что огневая мощь Экспресса была увеличена еще больше.

Помимо упомянутых выше, существует множество веб-фреймворков, реализованных на других языках.

Многое в Express вдохновлено Sinatra, облегченной веб-платформой в мире Ruby. Как и в Express, в Sinatra также есть возможности маршрутизации и промежуточного программного обеспечения. Идея фреймворка Sinatra была заимствована и повторно реализована многими другими языками.Если вы использовали такой фреймворк, вы должны быть знакомы с Express. Конечно, Express также заимствует фреймворки Bottle и Flask в Python.

Соответственно, существует огромный разрыв между Express и Django, Ruby on Rails, ASP.NET и другими фреймворками. Эти фреймворки очень большие, а структура программы богаче фиксированных функций. Кроме того, Express также сильно отличается от PHP, хотя оба работают на службе, но последний тесно связан с HTML.

Express — это всего лишь одна из серверных веб-платформ, поэтому мы не можем здесь сказать, что Express обязательно лучше других. Он имеет некоторые уникальные функции, такие как производительность Node.js и единый язык для интерфейса и сервера. Но в то же время у него гораздо меньше возможностей, чем у других фреймворков, а JavaScript не является «хорошим» языком, который признается большинством разработчиков. Бессмысленно обсуждать преимущества и недостатки вне конкретных сценариев, давайте рассмотрим некоторые применимые сценарии Express.

Сценарии применения Express

Теоретически Express можно использовать для создания любого веб-приложения. Ответ на все запросы также может быть выполнен упомянутой выше структурой. Итак, почему стоит выбрать Экспресс?

Самым большим преимуществом является то, что JavaScript, написанный на Node.js, может совместно использоваться браузером и клиентом. С точки зрения повторного использования кода эта ситуация идеальна. Это также очень полезно с психологической точки зрения, нет необходимости переключаться между режимом сервера и режимом клиента во время разработки. Front-end разработчики могут напрямую писать back-end код, не изучая новый язык. Конечно, фронтенд-разработчикам все равно нужно узнавать что-то новое, иначе этой книги бы не существовало.

Express может помочь вам в этом, и люди придумали название для этого стека: MEAN. Например, «LAMP» для Linux, Apache, MySQL и PHP, «MEAN» для MongoDB, Express, Angular и Node.js. Людям это нравится, потому что это чистый стек JavaScript.

Express часто используется для управления одностраничными приложениями (SPA). SPA в значительной степени зависят от JavaScript на внешнем интерфейсе и часто требуют серверного компонента. Большинство серверов просто обслуживают HTML, CSS и JavaScript, но иногда требуется наличие REST API. Express может делать и то, и другое, обслуживая HTML, а также отлично подходит для создания API. Относительно низкая кривая обучения Express позволяет разработчикам внешнего интерфейса создавать сервис SPA практически без изучения нового контента.

Когда вы используете Express для написания приложений, решено, что вы должны использовать части E и N технологического стека MEAN, а для двух других Express не ограничены, вы можете использовать разные решения. Например, Angular можно заменить на Backbone.js, чтобы сформировать стек MEBN. Замена MongoDB на SQL формирует стек SEAN. Хотя терминология MEAN широко распространена, а конфигурация очень популярна, выбор за вами. Стек технологий, который мы рассмотрим в этой книге, — это MEN: MongoDB, Express и Node.js.

Кроме того, Express также имеет некоторые функции реального времени. В то время как другие языки также поддерживают WebSocket и WebRTC, Node.js кажется сильнее. Это означает, что вы можете применять эти функции к программам Express. Из-за того, что может Node.js, Express делает то же самое.

Сторонние модули для Node.js и Express

В сообществе есть множество модулей, которые можно использовать в Express. Некоторые из них являются эксклюзивными для Express, и эти модули хорошо совместимы с функциями маршрутизации и промежуточного программного обеспечения. Другие инклюзивные модули также могут улучшить процесс разработки и производительность приложений Express.

Если у вас есть опыт работы с механизмами шаблонов, такими как ERB, Jinja2, HAML и т. д., вы обнаружите, что функции, поставляемые с Express, просто слабы для рендеринга HTML. К счастью, для решения этой проблемы Express также может использовать механизмы шаблонов сообщества, такие как EJS и Jade.

Кроме того, сам Express не поддерживает базы данных. Вы можете сохранять данные через файлы, реляционные базы данных или другие механизмы. Однако позже я расскажу, как вызывать базу данных MongoDB через Mongoose в Express.

Одно замечание: понятия Express-модулей не существует, поэтому сторонние библиотеки — это модули Node.js. Модули Node.js совместимы с Express и работают с ним. Все эти блоки представляют собой блоки кода JavaScript, которые зарегистрированы в репозитории npm и могут быть установлены единым методом. Как и в других средах, модули могут зависеть друг от друга, а разные модули могут взаимодействовать друг с другом. Кроме того, Express — это не что иное, как модуль в Node.js.

Hello World

Каждый раз, когда я узнаю что-то новое, подавляющее большинство начинают с Hello World.

Итак, теперь давайте посмотрим, как создать простой проект Hello World с помощью Express. Не обращайте слишком много внимания на детали кода, которые будут подробно описаны позже. код показывает, как показано ниже:

var express = require("express");  #A

var app = express();  #B

app.get("/", function(request, response) {  #C
  response.send("Hello world!");            #C
});                                         #C

app.listen(3000, function() {                       #D
  console.log("Express app started on port 3000."); #D
});                                                 #D

О: Импортируйте экспресс-модуль и создайте новую переменную.
B: Создайте приложение-приложение
C: Установите корневой маршрут доступа и установите ответ «Hello world!».
D: Установите порт, который прослушивает программа, и получите информацию об успешном запуске службы.

Напоминаю, что не имеет значения, если вы не понимаете весь код, позже будут более подробные пояснения.

Вы можете узнать все о Express в кратчайшие сроки.

резюме

В этой статье в основном представлены:

  • Node.js может писать веб-приложения, но процесс разработки неэффективен. Express элегантно решает эти проблемы.
  • Экспресс небольшой, но очень гибкий
  • Экспресс имеет несколько ключевых особенностей:
  • Промежуточное ПО разделяет обработку программы и выполняет ее последовательно и в цепочке.
  • Маршрутизация также разделяет программу и по-разному отвечает на разные запросы доступа в соответствии с правилами.
  • Подпроекты могут разделять большой Express, тем самым улучшая читаемость и облегчая последующее обслуживание.
  • Код в Express в основном требует написания функций обработки, а Express предоставляет для этого множество простых в использовании API.

оригинальныйадрес