Подайте заявку на нашу новую Data Science & AI и Cybersecurity Группы неполного рабочего времени

Введение в NodeJs

nodejs
javascript
сервер
Введение в NodeJs cover image

Введение

Когда пытаешься узнать о сети

разработке мы обычно обнаруживаем, что интерфейсная часть значительно более доступна, чем серверная часть. Для этого есть много причин, в частности ощущение мгновенной обратной связи, возникающей при изменении определенного элемента страницы в коде и обнаружении изменения, применяемого к веб-сайту. Такая обратная связь часто бывает полезна новичкам, поскольку позволяет им корректировать свой код и учиться на своих ошибках. К сожалению, с серверной частью дело обстоит иначе: зачастую значительный объем работы посвящен предварительной настройке среды и установке зависимостей, необходимых для того, чтобы на терминале появилось простое сообщение «Hello World». К счастью, это не так., в сообществе открытого исходного кода постоянно достигается большой прогресс в упрощении процесса разработки фреймворков, и улучшение опыта разработчиков NodeJs является хорошим примером этого. Этот фреймворк представляет собой очень эффективную технологию, позволяющую писать на стороне сервера. код на Javascript удобен и предлагает множество встроенных инструментов и функций, которые отличают его от конкурентов. В этой статье мы рассмотрим NodeJs и его экосистему, используя практический подход, создавая полнофункциональный проект.

Что мы будем строить?

Приложения ToDo — это идеальный проект для новичков, изучающих фронтенд-разработку. Вот почему мы решили создать API списка дел. Это позволит нам добавить постоянство данных в наш интерфейс и даст нам возможность манипулировать этими данными (путем добавления, обновления, удаления задач и т. д.).

Окончательный код можно найти здесь.

Наши инструменты

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

  • NodeJs, как мы уже упоминали, является одной из самых популярных платформ Javascript для создания серверных приложений.

— ExpressJs — это минимальная платформа Javascript, используемая поверх NodeJS. Он ускоряет процесс разработки за счет использования множества встроенных функций. Он также используется как способ стандартизации методов разработки проектов NodeJS, чтобы облегчить его использование инженерами.

— LowDB — это простая база данных в памяти. Его простота позволяет нам продемонстрировать, как взаимодействовать с базой данных в проекте NodeJs, не касаясь более сложных вопросов, таких как развертывание и конфигурация.

Теперь, когда мы определили все инструменты, которые будем использовать, давайте займемся клавиатурами и начнем программировать!

Монтаж

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

Нам также понадобится установленный npm. Npm — стандартный менеджер пакетов для NodeJs. Это позволит нам управлять зависимостями нашего проекта. Руководство по установке можно найти здесь.

Инициализация проекта

Перейдите по ссылке и клонируйте стартовый проект:

Это простой стартовый репозиторий для нашего проекта. Он содержит все зависимости, которые мы будем использовать, а также файловую структуру проекта. Мы объясним каждый элемент после достижения. Откройте терминал, перейдите к пути к проекту и выполните команду:

npm install

При этом будут установлены все зависимости проекта, указанные в файле package.json. package.json — это файл, который находится в корне любого проекта Javascript/NodeJs. Он содержит метаданные о последнем и используется для управления всеми зависимостями, скриптами и версиями проекта.

После того, как все зависимости установлены, мы можем запустить наше приложение:

npm run start

«start» — это скрипт, который мы указали в пакете. json-файл. Он указывает входной файл нашего приложения, в нашем случае это app.js.

Теперь в вашем терминале должно появиться следующее сообщение:

nodejs_1

Это означает, что наш сервер успешно запустился и прослушивает любые запросы, отправленные на порт 3000. Давайте посмотрим на app.js и объясним, что здесь происходит:

nodejs_2

App.js — это входной файл нашего проекта (и единственный на данный момент). Мы создаем экземпляр экспресс-приложения с именем app, указываем, что все запросы с http-методом «GET» и подпутью «/» будут обрабатываться по этому маршруту, передаем функцию, называемую промежуточным программным обеспечением, которая принимает объект запроса и ответа как параметры. Это очень важно, поскольку запрос содержит всю информацию, необходимую для его обработки (параметры, тело запроса, заголовки запроса и т. д.), а объект ответа — это тот объект, который будет возвращен клиенту. Начнем с отправки сообщения «Hello world». После этого мы заставляем наше приложение прослушивать любые входящие запросы на указанный порт (в нашем случае 3000) и регистрируем сообщение «Прослушивание порта 3000», чтобы указать, что наше приложение запущено, работает и готово принимать запросы.

Откройте терминал, в строке ссылок введите «localhost:3000/» и нажмите Enter. Это указанный путь, который мы можем использовать для локального доступа к нашему серверу. Вы получите следующее сообщение:

nodejs_3

Конфигурация базы данных

Lowdb — это база данных с открытым исходным кодом, которая проста в использовании и не требует специальной настройки. Основная идея заключается в хранении всех данных в локальном файле JSON. После установки LowDB (что было сделано при установке всех зависимостей) мы можем добавить в db.js следующий код:

nodejs_4

Этот код очень похож на тот, который можно найти в официальной документации LowDB. Мы немного подправили его для нашего собственного варианта использования. Давайте объясним это построчно:

Первые несколько строк предназначены для импорта необходимых зависимостей. «join» — это служебная функция, доступная в модуле «path». Это один из основных модулей NodeJs, который предлагает множество методов для работы с путями. «Low» и «JSONFile» — это два класса, предоставляемые LowDB. Первый создает экземпляр файла json, который будет содержать наши данные. Второй создает реальный экземпляр базы данных, который будет с ним работать. Наконец, «lodash» — одна из наиболее часто используемых библиотек JavaScript, предлагающая широкий спектр служебных функций для распространенных задач программирования. Мы добавляем его в экземпляр нашей базы данных, чтобы иметь возможность использовать его расширенные методы для обработки наших данных.

Сначала мы указываем путь к файлу db.json. Это файл, который будет содержать наши данные и передаваться в LowDB. Если файл не найден по указанному пути, LowDB создаст его.

Затем мы передаем путь к файлу адаптеру LowDB и передаем его в наш новый экземпляр базы данных LowDB. Затем переменную «db» можно использовать для связи с нашей базой данных. После создания экземпляра базы данных мы читаем из файла json с помощью db.read(). Это установит поле «данные» в нашем экземпляре базы данных, чтобы мы могли получить доступ к содержимому базы данных. Обратите внимание, что мы предварили эту строку словом «await». Это делается для того, чтобы указать, что для выполнения этой инструкции может потребоваться неизвестное количество времени и что процесс NodeJs должен дождаться ее выполнения, прежде чем приступить к остальной части кода. Мы делаем это, потому что операция чтения требует доступа к памяти указанного файла, а время выполнения такого рода операции зависит от характеристик вашего компьютера.

Теперь, когда у нас есть доступ к полю данных, мы устанавливаем его как объект, содержащий пустой массив сообщений, или, скорее, мы проверяем, содержит ли файл какие-либо предыдущие данные, и устанавливаем пустой массив, если это не так.

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

Общий рабочий процесс запроса/ответа

Рассмотрим следующую диаграмму:

nodejs_5

Здесь показана общая архитектура, применяемая во множестве серверных приложений, созданных с помощью NodeJs/Express. Понимание общего рабочего процесса обработки запроса не только позволит вам создавать и структурировать приложения NodeJs, но также позволит вам перенести эти концепции практически в любой технический стек по вашему выбору. Мы рассмотрим различные слои, которые мешают этому процессу, и объясним их роль:

## Уровень HTTP-запроса

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

  • Маршрутизаторы: здесь мы имеем в виду маршрутизаторы Express, но эту концепцию можно найти во многих серверных платформах. Маршрутизаторы — это способ применить логическое распределение в нашей бизнес-логике к нашему коду. Это означает, что каждый набор элементов, имеющих схожие функции, обрабатывается одной и той же записью и может быть отделен от остальных наборов. Преимущество этого заключается в том, что каждый компонент кода становится независимым от других, а также упрощается обслуживание и расширение. Более конкретно, например, все запросы, соответствующие условиям общего URL-адреса «/posts», будут обрабатываться одним и тем же маршрутизатором. В зависимости от метода http (GET, POST и т. д.) будет использоваться другой контроллер.

  • Контроллеры: контроллер получает отфильтрованные запросы от маршрутизаторов, применяет дополнительную обработку и вызывает подходящие методы обслуживания.

Уровень бизнес-логики

Этот уровень уникален и зависит от конкретных вариантов использования приложения и лежащей в его основе бизнес-логики.

  • Службы: Службы представляют собой набор методов, которые содержат основную логику приложения. Они также взаимодействуют с базой данных посредством использования ORM/ODM.).

  • Сторонние сервисы: многие современные приложения предпочитают делегировать часть логики приложения выделенным сервисам, доступным через API. Сервисами такого рода могут быть сервисы обработки платежей, хранения статических файлов, уведомлений и другие.

  • ODM/ORM: ORM и ODM выступают в качестве посредников между службами и базой данных. Их роль заключается в обеспечении высокоуровневой абстракции базы данных, которая позволяет разработчику писать код на языке программирования по своему выбору вместо специальных языков баз данных, таких как SQL.

Уровень сохранения данных

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

Пример: добавление сообщения

Теперь, когда мы поняли общую идею архитектуры, давайте применим ее к нашему простому примеру. Мы реализуем функцию добавления поста в наше приложение. Предположим, что любое сообщение имеет уникальный идентификатор, который позволит нам позже идентифицировать его в нашей базе данных, заголовок, представляющий собой строку, и порядок, имеющий целочисленный тип. Следуя нашей схеме, мы начнем с реализации маршрутизатора. Добавьте следующий код в файл index.js:

Starting a server in ExpressJS

Это наш файл маршрутизатора. Мы импортируем экспресс и метод «addPost» из нашего контроллера (мы вскоре реализуем его), создаем экземпляр экспресс-маршрутизатора и привязываем метод addPost к нашему маршрутизатору — это означает, что для каждого запроса, имеющего корневой путь и http метод «POST», для его обработки будет вызван метод «addPost».

Прежде чем реализовать наш метод в контроллере, мы ссылаемся на новый маршрутизатор в нашем основном файле app.js и указываем его путь как «/posts»: все маршруты с указанными путями будут перенаправлены на этот маршрутизатор, чтобы их можно было обработать. различными методами контроллера:

Starting a server in ExpressJS

Импортируем маршрутизатор и называем его «posts». app.use("/posts",..) означает, что все запросы с подпутем "/posts", независимо от их метода http, будут перенаправляться на указанный маршрутизатор.

Другие изменения в app.js включают импорт файла конфигурации базы данных для его выполнения и использование express.json() в качестве промежуточного программного обеспечения, позволяющего нам получить доступ к объекту тела запроса.

Теперь, когда наши маршруты установлены, мы можем добавить метод addPost в файл контроллера.js:

Starting a server in ExpressJS

«addPost» — это функция промежуточного программного обеспечения, которая принимает в качестве параметров объекты запроса, ответа и следующую функцию. При вызове следующей функции процесс перейдет к следующему промежуточному программному обеспечению в цепочке или завершит запрос. В коде метода мы извлекаем заголовок и порядок из тела запроса и передаем их в качестве параметров сервисной функции createPost. Эта функция принимает атрибуты сообщения, создает новое сообщение и возвращает его. Как только новое сообщение создано, мы возвращаем его клиенту вместе с кодом состояния 200, что означает, что запрос был успешным. Вы можете заметить, что наш код помещен внутри блока try/catch, чтобы отловить любую неожиданную ошибку и передать ее следующему промежуточному программному обеспечению. Рекомендуется прикрепить ко всем маршрутизаторам промежуточное программное обеспечение для обработки ошибок, которое извлекает ошибку и возвращает клиенту значимое сообщение об ошибке.

Теперь осталось реализовать функцию createPost в service.js:

nodejs_6

Как мы упоминали ранее при объяснении различных уровней архитектуры, уровень обслуживания взаимодействует с решением для хранения данных посредством использования ORM/ODM. Однако в нашем примере нам не понадобится использовать отдельный ORM, поскольку Lowdb имеет встроенную поддержку Javascript. Все подробности о его синтаксисе можно найти в документации.

Метод createPost получает заголовок и порядок в качестве параметров и использует их для создания объекта сообщения. Для уникального идентификатора мы используем специальную библиотеку под названием «nanoid», которая генерирует уникальную последовательность символов. Мы добавляем новый пост в массив сообщений в базе данных и записываем эти изменения; новое сообщение затем возвращается функцией.

Теперь, когда «createPost» готов, функция добавления сообщений завершена и запущена. Мы тестируем его с помощью Postman, популярного инструмента для тестирования API:

nodejs_7

Мы выбираем «POST» в качестве метода http для запроса вместе с указанным URL-адресом «localhost:3000/posts». Мы добавляем заголовок и порядок в формате json в раздел body и отправляем запрос. Как показано выше, мы получаем статус 200 ОК вместе с вновь созданным сообщением.

Заключение

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

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


Career Services background pattern

Карьерные услуги

Contact Section background image

Давай останемся на связи

Code Labs Academy © 2024 Все права защищены.