Что такое среда разработки Express

Содержание

Слайд 2

Что такое среда разработки Express?

Среда разработки Express включает в себя установку Nodejs,

Что такое среда разработки Express? Среда разработки Express включает в себя установку
менеджера пакетов NPM и (опционально) Express Express Generator на вашем локальном компьютере.

Слайд 3

Node и менеджер пакетов NPM устанавливаются вместе из готовых двоичных пакетов, установщиков,

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

Слайд 4

NPM также можно использовать для установки Express Application Generator, удобного инструмента для создания веб-приложений скелета Express.

NPM также можно использовать для установки Express Application Generator, удобного инструмента для создания веб-приложений скелета Express.

Слайд 5

В отличие от других веб-фреймворков среда разработки не включает отдельный веб-сервер разработки.

В отличие от других веб-фреймворков среда разработки не включает отдельный веб-сервер разработки.
В Node / Express веб-приложение создает и запускает собственный веб-сервер

Слайд 6

Другие зависимости, такие как драйверы баз данных, механизмы шаблонов, механизмы проверки подлинности

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

Слайд 7

НАЧАЛО РАБОТЫ

Сперва вы устанавливаете инструмент генератора на весь сайт с помощью диспетчера

НАЧАЛО РАБОТЫ Сперва вы устанавливаете инструмент генератора на весь сайт с помощью
пакетов NPM, как показано:

Слайд 8

Генератор имеет несколько параметров, которые вы можете просмотреть в командной строке с помощью команды -help (или

Генератор имеет несколько параметров, которые вы можете просмотреть в командной строке с
-h):

Слайд 9

Далее вам необходимо выбрать
движок шаблонов
   Вот чем они могут отличаться:

Далее вам необходимо выбрать движок шаблонов Вот чем они могут отличаться:

Слайд 10

⦁    Наследование макета
⦁    Поддержка «Include»
⦁    Возможность фильтровать значения переменных на уровне шаблона 
⦁   

⦁ Наследование макета ⦁ Поддержка «Include» ⦁ Возможность фильтровать значения переменных на
Возможность создавать выходные форматы, отличные от HTML 
⦁    Поддержка асинхронных операций и потоковой передачи

Слайд 11

Для примера создадим проект с использованием библиотеки шаблонов Pug и без CSS-таблицы стилей

Для примера создадим проект с использованием библиотеки шаблонов Pug и без CSS-таблицы стилей

Слайд 12

Сначала перейдите туда, где вы хотите создать проект, а затем запустите генератор

Сначала перейдите туда, где вы хотите создать проект, а затем запустите генератор
экспресс-приложений в командной строке, как показано:

Слайд 13

Генератор создаст (и перечислит) файлы проекта

Генератор создаст (и перечислит) файлы проекта

Слайд 14

В конце вывода генератор предоставляет инструкции по установке зависимостей (как указано в

В конце вывода генератор предоставляет инструкции по установке зависимостей (как указано в
файле package.json), а затем о том, как запустить приложение 

Слайд 15

Запуск скелетного сайта

⦁    Сначала установите зависимости (команда установки выберет все пакеты зависимостей,

Запуск скелетного сайта ⦁ Сначала установите зависимости (команда установки выберет все пакеты
перечисленные в файле package.json проекта)

Слайд 16

⦁    Затем запустите приложение.
В Windows используйте следующую команду:

⦁ Затем запустите приложение. В Windows используйте следующую команду:

Слайд 17

⦁    Затем загрузите http://localhost:3000/
в свой браузер, чтобы получить доступ к приложению.
Вы

⦁ Затем загрузите http://localhost:3000/ в свой браузер, чтобы получить доступ к приложению.
должны увидеть страницу браузера, которая выглядит так

Слайд 18

Конвейер обработки запроса и middleware

Когда фреймворк Express получает запрос, этот запрос передается

Конвейер обработки запроса и middleware Когда фреймворк Express получает запрос, этот запрос
в конвейер обработки. Конвейер состоит из набора компонентов или middleware, которые получают данные запроса и решают, как его обрабатывать.

Здесь конвейер обработки состоял из вызовов app.get(), которые сравнивали запрошенный адрес с маршрутом, и если между адресом и маршрутом было соответствие, то данный запрос обрабатывался методом app.get().

Слайд 19

При необходимости мы можем встроить в конвейер обработки запроса на любом этапе

При необходимости мы можем встроить в конвейер обработки запроса на любом этапе
любую функцию middleware. Для этого применяется метод app.use(). Так, изменим файл app.js следующим образом:

Функция, которая передается в app.use(), принимает три параметра:
- request: данные запроса
- response: объект для управления ответом
- next: следующая в конвейере обработки функция
Каждая из функций middleware просто выводит на консоль сообщение и в конце вызывает следующую функцию с помощью вызова next().
При запуске приложения после обращения по адресу "http://localhost:3000/" последовательно отработают все три middleware:

Слайд 20

Однако необязательно вызывать все последующие middleware, мы можем на каком-то этапе остановить

Однако необязательно вызывать все последующие middleware, мы можем на каком-то этапе остановить
обработку:

Теперь обработка завершается на Middleware 2, так как в этом методе происходит отправка ответа с помощью response.send(), а вызова следующей функции через next():

Слайд 21

Пример Middleware

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

Пример Middleware Middleware помогают выполнять некоторые задачи, которые должны быть сделаны до
отправки ответа. Стандартная задача - логгирование запросов.
Например, изменим файл app.js следующим образом:

Здесь с помощью объекта request получаем различную информацию о запросе и добавляем ее в файл server.log, используя модуль fs.

Слайд 22

Отправка ответа

Для отправки ответа в express у объекта response можно использовать ряд

Отправка ответа Для отправки ответа в express у объекта response можно использовать
функций. Самый распространенный способ отправки ответа представляет функция send(). В качестве параметра эта функция может принимать объект Buffer, строку, в том числе с html-кодом, объект javascript или массив.

Объект Buffer формально представляет некоторые бинарные данные. Так, в случае выше при выполнении кода по умолчанию браузер загрузит файл, в котором будет строка "Hello Express".

Слайд 23

sendFile()

Метод send удобен для отправки строк, некоторого кода html небольшой длины, однако

sendFile() Метод send удобен для отправки строк, некоторого кода html небольшой длины,
есть отправляемый код html довольно большой, то соответственно код приложения тоже становится громоздким. Например, мы можем написать так:

Однако гораздо лучше определять код html в отдельных файлах и затем эти файлы отправлять с помощью функции sendFile().
Например, определим в папке проекта новый файл index.html:

Слайд 24

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

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

Отправка статусных кодов

Функция sendStatus() отправляет пользователю определенный статусный код с некоторым сообщением по умолчанию. Например, отправим статусный код 404, который говорит, что ресурс не найден:

Слайд 25

Как видно из скриншота, при отправке статусного кода 404 также отправляется сообщение

Как видно из скриншота, при отправке статусного кода 404 также отправляется сообщение
"Not Found". Но, возможно, мы захотим отправлять какие-то свои более информативные сообщения. В этом случае можно использовать комбинацию функции status(), которая также отправляет статусный код, и функции send():

Слайд 26

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

При обработке запросов фреймворк Express опирается на систему маршрутизации. В приложении определяются

Маршрутизация При обработке запросов фреймворк Express опирается на систему маршрутизации. В приложении
маршруты, а также обработчики этих маршрутов. Если запрос соответствует определенному маршруту, то вызывается для обработки запроса соответствующий обработчик.
Для обработки данных по определенному маршруту можно использовать ряд функций, в частности:
-use
-get
-post
-put
-delete

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

Слайд 27

Символы подстановок

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

Символы подстановок Используемые шаблоны адресов могут содержать регулярные выражения или специальные символы
В частности, мы можем использовать такие символы, как ?, +, * и ().
К примеру, символ ? указывает, что предыдущий символ может встречаться 1 раз или отсутствовать. И мы можем определить следующую функцию:

Такой маршрут будет соответствовать
строке запроса "/bk" или "/bok".
Символ + указывает, что предыдущий символ может встречаться 1 и более раз:

Такой маршрут будет соответствовать запросам "/bok", "/book", "/boook" и так далее.

Символ звездочка * указывает, что на месте данного символа может находиться любое количество символов:

Такой маршрут будет соответствовать запросам "/bork", "/bonk", "/bor.dak", "/bor/ok" и так далее.

Слайд 28

Скобки () позволяют оформить группу символов, которые могут встречаться в запросе:

Выражение (.html)?

Скобки () позволяют оформить группу символов, которые могут встречаться в запросе: Выражение
указывает, что подстрока ".html" может встречаться или отсутствовать в строке запроса. И такой маршрут будет соответствовать запросам "/book" и "/book.html".
Также вместо определения маршрутов мы можем указывать регулярные выражения. Например, необходимо перехватить запрос ко всем файлам html или всем путям, которые в конце имеют ".html":

Слайд 29

Переадресация

Для переадресации применяется метод redirect(): redirect([status,] path)

В качестве параметра path передается путь, на

Переадресация Для переадресации применяется метод redirect(): redirect([status,] path) В качестве параметра path
который будет перенаправляться пользователь. Дополнительный параметр status задает статусный код переадресации. Если этот параметр не задан, тогда по умолчанию отправляется статусный код 302, который предполагает временную переадресацию.
С помощью данного метода можно выполнять переадресацию как по относительным путям, так и по абсолютным, в том числе на другие домены.

Слайд 30

Переадресация по оносительным путям также не очень сложна, но здесь важно учитывать,

Переадресация по оносительным путям также не очень сложна, но здесь важно учитывать,
как именно определяется адрес для редиректа. Рассмотрим редирект относительно текущего пути, с которого производится редирект. Например:

В данном случае будет идти перенаправление с ресурса "/home" на ресурс "/about", то есть, условно говоря, с http://localhost:3000/home на http://localhost:3000/about.

Еще несколько примеров. Переадресация относительно текущего адреса на адрес на том же уровне:

Здесь идет переадресация с http://localhost:3000/home/foo/bar на http://localhost:3000/home/foo/about

Переадресация на адрес, который располагается уровнем выше:

Слайд 31

Передача данных приложению. Параметры строки запроса

Одним из способов передачи данных в приложение

Передача данных приложению. Параметры строки запроса Одним из способов передачи данных в
представляет использование параметров строки запроса. Строка запроса (query) - фактически это часть запрошенного адреса, которая идет после знака вопроса. Например, в запросе http://localhost:3000/about?id=3&name=Tome
часть id=3&name=Tome представляет строку запроса.

В Express мы можем получить параметра строки запроса через свойство query объекта request, который передается в функцию обработки запроса. Например:

Слайд 32

POST-запросы и отправка форм

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

POST-запросы и отправка форм При оправке каких-то сложных данных обычно используются формы.
как получать отправленные данные в Express.
Для получения данных форм из запроса необходимо использовать специальный пакет body-parser. Поэтому вначале добавим его в проект с помощью команды npm install body-parser --save

Слайд 33

Прежде всего для получения отправленных данных необходимо создать парсер:
const urlencodedParser = bodyParser.urlencoded({extended:

Прежде всего для получения отправленных данных необходимо создать парсер: const urlencodedParser =
false});

Поскольку данные отправляются с помощью формы, то для создания парсера применяется функция urlencoded(). В эту функцию передается объект, устанавливающий параметры парсинга. Значение extended: false указывает, что объект - результат парсинга будет представлять набор пар ключ-значение, а каждое значение может быть представлено в виде строки или массива.

Так как данные отправляются с помощью метода POST, то для обработки определяем функцию app.post("/register",...). Первый параметр функции - адрес, на который идет отправка - "/register". Стоит отметить, что в данном случае с одинм адресом "/register" связаны две функции, только одна обрабатывает запросы get, а другая - запросы post. Второй параметр - выше созданный парсер. Третий параметр - обработчик:

Слайд 34

Параметры маршрута

Параметры маршрута представляют именованные сегменты URL-адреса. Не стоит их путать с

Параметры маршрута Параметры маршрута представляют именованные сегменты URL-адреса. Не стоит их путать
параметрами строки запроса. Например:

Здесь параметры строки запроса - это то, что идет после вопросительного знака - id=3&name=Tome. Остальная часть, которая идет до вопросительного знака может содержать параметры маршрута.
Название параметра должно включать символы из диапазона [A-Za-z0-9_]. В определении маршрута параметры предваряются знаком двоеточия:

Слайд 35

Router

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

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

Здесь у нас есть пять маршрутов, которые обрабатываются различными обработчиками. Но три из этих маршрутов начинаются с "/products" и условно относятся к некоторому функционалу по работе с товарами (просмотр списка товаров, просмотр одного товара по id и добавление товара). Объект Router позволяет связать подобный функционал в одно целое и упростить управление им. Например, перепишем предыдущий пример с использованием объекта Router:

Слайд 36

Здесь определен объект productRouter, который обрабатывает все запросы по маршруту "/products". Это

Здесь определен объект productRouter, который обрабатывает все запросы по маршруту "/products". Это
главный маршрут. Однако в рамках этого маршрута может быть подмаршрут "/" со своим обработчиком, а также подмаршруты "/:id" и "/create", которые также имеют свои обработчики.

Слайд 37

Начало работы с MongoDB

Наиболее популярной системой управления базами данных для Node.js на

Начало работы с MongoDB Наиболее популярной системой управления базами данных для Node.js
данный момент является MongoDB. Для работы с этой платформой прежде всего необходимо установить сам сервер MongoDB.

При подключении и взаимодействии с бд в MongoDB можно выделить следующие этапы:
* Подключение к серверу
* Получение объекта базы данных на сервере
* Получение объекта коллекции в базе данных
* Взаимодействие с коллекцией (добавление, удаление, получение, изменение данных)

Слайд 38

Ключевым классом для работы с MongoDB является класс MongoClient, и через него будет

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

Для подключения к серверу mongodb применяется метод connect():

Слайд 39

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

Получив объект подлюченного клиента, мы можем обращаться к базе данных на сервере.
Для этого используется метод client.db(назв бд)
База данных в MongoDB не имеет таблиц.
* Вместо этого все данные попадают в коллекции.
* В рамках node.js для взаимодействия с базой данных (добавления, удаления, чтения данных) нам потребуется получить объект коллекции. Для этого применяется метод db.collection("название_коллекции"), в который передается название коллекции.
* В отличие от таблиц в реляционных системах, где все данные хранятся в виде строк, в коллекциях в MongoDB данные хранятся в виде документов. Например, добавим в базу данных один документ. Для этого определим в каталоге проекта следующий файл app.js:

Слайд 40

В качестве базы данных здесь используется "usersdb". При этом не важно, что

В качестве базы данных здесь используется "usersdb". При этом не важно, что
по умолчанию на сервере MongoDB нет подобной базы данных. При первом к ней обращении сервер автоматически ее создаст.

Слайд 41

Добавление и получение данных в MongoDB

Для добавления мы можем использовать различные методы.

Добавление и получение данных в MongoDB Для добавления мы можем использовать различные
Если нужно добавить один объект, то применяется метод insertOne(). При добавлении набора объектов можно использовать метод insertMany().

Слайд 42

Получение данных

Получение данных

Слайд 43

Удаление документов в MongoDB

Удалять документы в MongoDB можно различными способами. Здесь надо

Удаление документов в MongoDB Удалять документы в MongoDB можно различными способами. Здесь
отметить следующие методы коллекции:
deleteMany(): удаляет все документы, которые соответствуют определенному критерию
deleteOne(): удаляет один документ, который соответствует определенному критерию
findOneAndDelete(): получает и удаляет один документ, который соответствует определенному критерию
drop(): удаляет всю коллекцию
Удалим всех пользователей, у которых имя "Tom":

Слайд 44

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

При обработке запросов фреймворк Express опирается на систему маршрутизации. В приложении определяются

Маршрутизация При обработке запросов фреймворк Express опирается на систему маршрутизации. В приложении
маршруты, а также обработчики этих маршрутов. Если запрос соответствует определенному маршруту, то вызывается для обработки запроса соответствующий обработчик.
Для обработки данных по определенному маршруту можно использовать ряд функций, в частности:
-use
-get
-post
-put
-delete

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

Слайд 45

Для обновления элементов в MongoDB есть несколько методов:
* updateOne
* updateMany

Для обновления элементов в MongoDB есть несколько методов: * updateOne * updateMany
* findOneAndUpdate()
Метод findOneAndUpdate() обновляет один элемент. Он принимает следующие параметры:
Критерий фильтрации документа, который надо обновить
Параметр обновления
Дополнительные опции обновления, которые по умолчанию имеют значение null
Функция обратного вызова, которая выполняется при обновлении

Обновление документов в MongoDB

Слайд 46

Mongoose
Mongoose представляет специальную ODM-библиотеку (Object Data Modelling) для работы с MongoDB, которая

Mongoose Mongoose представляет специальную ODM-библиотеку (Object Data Modelling) для работы с MongoDB,
позволяет сопоставлять объекты классов и документы коллекций из базы данных. Грубо говоря, Mongoose работает подобно инструментам ORM

Слайд 47

Первый параметр в методе mongoose.model указывает на название модели. Mongoose затем будет автоматически искать

Первый параметр в методе mongoose.model указывает на название модели. Mongoose затем будет
в базе данных коллекцию, название которой соответствует названию модели во множественном числе.
Второй параметр функции mongoose.model - собственно схема.

const User = mongoose.model("User", userScheme);

Слайд 48

Схема в Mongoose определяет метаданные модели - ее свойства, типы данных и

Схема в Mongoose определяет метаданные модели - ее свойства, типы данных и
ряд другой информации.
В прошлой теме схема определялась следующим образом:

Определение схемы в Mongoose

Слайд 49

Валидация

required: требует обязательного наличия значения для свойства
min и max: задают минимальное и максимальное значения

Валидация required: требует обязательного наличия значения для свойства min и max: задают
для числовых данных
minlength и maxlength: задают минимальную и максимальную длину для строк
enum: строка должна представлять одно из значений в указанном массиве строк
match: строка должна соответствовать регулярному выражению

Слайд 50

Здесь мы рассмотрели лишь основные механизмы библиотеки express.js, те, которые ответственны за

Здесь мы рассмотрели лишь основные механизмы библиотеки express.js, те, которые ответственны за
работу веб-сервера, но эта библиотека обладает и многими другими возможностями. Мы не останавливались на проверках, которые проходят запросы до поступления их в обработчики, мы не говорили о вспомогательных методах, которые доступны при работе с переменными res и req. И, наконец, мы не затрагивали одну из наиболее мощных возможностей express. Она заключается в использовании промежуточного программного обеспечения, которое может быть направлено на решение практически любых задача — от разбора запросов до реализации полноценной системы аутентификации. Надеемся, этот материал помог вам разобраться в основных особенностях устройства express, и теперь вы, при необходимости, сможете понять всё остальное, самостоятельно проанализировав интересующие вас части исходного кода этой библиотеки.

Итоги