Web-программирование. Основы Node.js

Содержание

Слайд 2

Технологии JavaScript

Технологии JavaScript

Слайд 3

Основы Node.js

Node.js представляет среду выполнения кода на JavaScript, которая построена на основе

Основы Node.js Node.js представляет среду выполнения кода на JavaScript, которая построена на
движка JavaScript Chrome V8, который позволяет транслировать вызовы на языке JavaScript в машинный код.
Node.js прежде всего предназначен для создания серверных приложений на языке JavaScript, хотя также существуют проекты по написанию десктопных приложений (к примеру, фреймворк Electron, разработанный GitHub) и даже по созданию кода для микроконтроллеров.
Но прежде всего мы говорим о Node.js, как о платформе для создания веб-приложений.
Для разработки под Node.js достаточно простейшего текстового редактора.

Слайд 4

Инструмент REPL

Для загрузки перейдите на официальный сайт https://nodejs.org/en/.
После установки на компьютер Node.js

Инструмент REPL Для загрузки перейдите на официальный сайт https://nodejs.org/en/. После установки на
нам становится доступным инструмент REPL.
REPL (Read Eval Print Loop) представляет возможность запуска выражений на языке JavaScript в командной строке (ОС Windows) или терминале (OS X, Linux).
При запуске командной строки (cmd) или терминала можно ввести команду node.
После ввода этой команды можно выполнять различные выражения на JavaScript.
Есть несколько команд, которые позволят управлять данным режимом. К примеру, команда «.exit» позволит выйти из режима REPL.

Слайд 5

Инструмент REPL

Пример:
При ошибке в коде REPL укажет об этом:

Инструмент REPL Пример: При ошибке в коде REPL укажет об этом:

Слайд 6

Инструмент REPL

Выполнение файла
Вместо того чтобы вводить весь код напрямую в консоль, удобнее

Инструмент REPL Выполнение файла Вместо того чтобы вводить весь код напрямую в
вынести его во внешний файл.
Например, создадим файл app.js с кодом:
Он просто выводит текст в консоль. Выполним его командой node:

Слайд 7

Модули

Node.js использует модульную систему.
Вся встроенная функциональность разбита на отдельные пакеты или

Модули Node.js использует модульную систему. Вся встроенная функциональность разбита на отдельные пакеты
модули.
Модуль представляет блок кода, который может использоваться в других модулях.
При необходимости мы можем подключать нужные нам модули.
В документации (https://nodejs.org/api/) можно узнать о встроенных модулях Node.js и их функциональности.

Слайд 8

Модули

Для загрузки модулей применяется функция require().
К примеру, для получения и обработки

Модули Для загрузки модулей применяется функция require(). К примеру, для получения и
запроса был необходим модуль http.
Создадим файл app.js:

Слайд 9

Модули

Подобным образом мы можем загружать и использовать другие встроенные модули.
Например, используем

Модули Подобным образом мы можем загружать и использовать другие встроенные модули. Например,
модуль os, который предоставляет информацию об окружении и ОС.

Слайд 10

Пользовательские модули

При необходимости можно создавать свои модули.
Но в отличие от встроенных

Пользовательские модули При необходимости можно создавать свои модули. Но в отличие от
модулей для подключения своих модулей надо передать в функцию require относительный путь с именем файла.
К примеру, если файл «app1.js» располагается рядом с запускаемым файлом:
Для его исполнения можно написать:

Слайд 11

Пользовательские модули

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

Пользовательские модули Передача данных из модуля Если мы описываем переменные или функции
то извне они недоступны.
Чтобы они стали доступны, необходимо определить их в объекте module.exports.
Объект module.exports – это то, что возвращает функция require() при получении модуля.
Объект module представляет ссылку на текущий модуль, а его свойство exports определяет все свойства и методы модуля, которые могут быть экспортированы и использованы в других модулях.

Слайд 12

Пользовательские модули

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

Пользовательские модули Например, создан файл модуля moduleTime.js: Подключим его в файле app.js:
что подключаемые модули кэшируются. Если несколько раз получить модуль в разные константы, то все они будут указывать на один и тот же объект.

Слайд 13

Пользовательские модули

Передача конструктора из модуля
Кроме определения простейших функций или свойств в модуле

Пользовательские модули Передача конструктора из модуля Кроме определения простейших функций или свойств
могут определяться сложные объекты или функции конструкторов.
Пример:
Создадим файл модуля user.js:

Слайд 14

Пользовательские модули

Весь модуль user указывает на определенную функцию конструктора.
Файл app.js:

Пользовательские модули Весь модуль user указывает на определенную функцию конструктора. Файл app.js:

Слайд 15

Структура модулей

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

Структура модулей Нередко модули приложения образуют какие-то отдельные наборы или области. Такие
модулей лучше помещать в отдельные каталоги.
Например, у нас есть в каталоге приложения подкаталог welcome, а в нем три файла: index.js, morning.js, evening.js. В итоге общая структура проекта:

Слайд 16

Структура модулей

Файл morning.js:
Файл evening.js:
Файл index.js:

Структура модулей Файл morning.js: Файл evening.js: Файл index.js:

Слайд 17

Структура модулей

Теперь используем модуль index.js в файле app.js:
Так как файла welcome.js нет, но

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

Слайд 18

Объект global и глобальные переменные

Node.js предоставляет специальный объект global, который предоставляет доступ

Объект global и глобальные переменные Node.js предоставляет специальный объект global, который предоставляет
к глобальным переменным и функциям. Примерным аналогом данного объекта в JavaScript является объект window.
Для примера создадим следующий модуль greeting.js:

Слайд 19

Объект global и глобальные переменные

Определим файл приложения app.js:
Здесь устанавливаем глобальную переменную name, которую

Объект global и глобальные переменные Определим файл приложения app.js: Здесь устанавливаем глобальную
мы получаем в модуле greeting.js и также выводим на консоль глобальную переменную date.

Слайд 20

Передача параметров приложению

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

Передача параметров приложению При запуске приложения из терминала/командной строки можно передавать ему

Для получения параметров в коде приложения применяется массив process.argv.
Первый элемент этого массива всегда указывает на путь к файлу node.exe, который вызывает приложение.
Второй элемент массив всегда указывает на путь к файлу приложения, который выполняется.

Слайд 21

Передача параметров приложению

К примеру, определим следующий файл app.js:

Передача параметров приложению К примеру, определим следующий файл app.js:

Слайд 22

Передача параметров приложению

Запуск приложения без параметров и с ними:

Передача параметров приложению Запуск приложения без параметров и с ними:

Слайд 23

Установка модулей

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

Установка модулей Кроме встроенных и пользовательских модулей Node.js существует огромное количество различных
фреймворков и утилит, созданных сторонними производителями и которые можно использовать в проекте, например, express, grunt, gulp и т.д.
Чтобы удобнее было работать со всеми сторонними решениями, они распространяются в виде пакетов.
Для автоматизации установки и обновления пакетов в Node.js используется пакетный менеджер NPM (Node Package Manager), который устанавливается вместе с Node.js. Но можно обновить установленную версию до последней.

Слайд 24

Установка модулей

Можно обновить установленную версию NPM до последней:
npm install npm@latest -g
Может

Установка модулей Можно обновить установленную версию NPM до последней: npm install npm@latest
потребоваться запустить командную строку от имени администратора.
Чтобы узнать текущую версию NPM:
npm -v

Слайд 25

Установка модулей

Файл package.json
Для более удобного управления конфигурацией и пакетами приложения в NPM

Установка модулей Файл package.json Для более удобного управления конфигурацией и пакетами приложения
применяется файл конфигурации package.json.
К примеру, у нас имеется каталог проекта modulesapp. Добавим в него файл package.json:
Здесь определены только две секции: имя проекта – modulesapp и его версия - 1.0.0. Это минимально необходимое определение файла package.json.

Слайд 26

Установка модулей

Далее для примера установим в проект пакет Express.
Для установки функциональности

Установка модулей Далее для примера установим в проект пакет Express. Для установки
Express в проект вначале перейдем в каталог проекта, затем введем команду:
npm install express

Слайд 27

Установка модулей

После установки Express в папке проекта modulesapp появится подпапка node_modules, в которой

Установка модулей После установки Express в папке проекта modulesapp появится подпапка node_modules,
будут храниться все установленные внешние модули.
В файл package.json также добавится информация о данном модуле:
Информация обо всех добавляемых пакетах, которые используются при работе приложения, добавляется в секцию dependencies.

Слайд 28

Установка модулей

Можно устанавливать множество пакетов одной командой.
В этом случае мы можем

Установка модулей Можно устанавливать множество пакетов одной командой. В этом случае мы
определить все необходимые пакеты в файле package.json и потом одной командой их установить. К примеру:
Затем для загрузки всех пакетов выполнить команду
npm install

Слайд 29

Установка модулей

Для удаления пакетов используется команда npm uninstall. Например:
npm uninstall express
Если нам надо

Установка модулей Для удаления пакетов используется команда npm uninstall. Например: npm uninstall
удалить не один пакет, а несколько, то мы можем удалить их определение из файла package.json и ввести команду npm install, и удаленые из package.js пакеты также будут удалены из папки node_modules.

Слайд 30

Команды NPM

NPM позволяет определять в файле package.json команды, которые выполняют определенные действия.

Команды NPM NPM позволяет определять в файле package.json команды, которые выполняют определенные

Например, определим следующий файл app.js:

Слайд 31

Команды NPM

Определим следующий файл package.json:
Здесь добавлена секция scripts, которая определяет две команды.
Названия

Команды NPM Определим следующий файл package.json: Здесь добавлена секция scripts, которая определяет
и количество команд могут быть произвольными.

Слайд 32

Команды NPM

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

Команды NPM Но надо учитывать, что есть некоторые предопределенные названия для команд,
start, test, run и т.д.
И для их выполнения в терминале/командной строке надо выполнить команду в каталоге приложения:
npm [название_команды]
Команды с остальными названиями (например, «dev») запускаются так:
npm run [название_команды]

Слайд 33

Команды NPM

Например, последовательно выполним обе команды:

Команды NPM Например, последовательно выполним обе команды:

Слайд 34

Асинхронность в Node.js

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

Асинхронность в Node.js Асинхронность представляет возможность одновременно выполнять сразу несколько задач. Например,
в файле приложения app.js у нас расположен следующий синхронный код:

Слайд 35

Асинхронность в Node.js

Для рассмотрения асинхронности изменим код файла app.js следующим образом:
Теперь вывод сообщения «Обработка

Асинхронность в Node.js Для рассмотрения асинхронности изменим код файла app.js следующим образом:
данных…» будет выполняться асинхронно с остальным кодом.
Для того используется функция setTimeout().

Слайд 36

Асинхронность в Node.js

Результат:
Несмотря на то, что в setTimeout передается промежуток 0, фактическое

Асинхронность в Node.js Результат: Несмотря на то, что в setTimeout передается промежуток
выполнение функции display завершается после всех остальных функций, которые определены в программе. В итоге исполнение кода на функции display не блокируется, а идет дальше.
Такое происходит из-за того, что функции обратного вызова в асинхронных функциях помещаются в специальную очередь, и начинают выполняться после того, как все остальные синхронные вызовы в приложении завершат свою работу.

Слайд 37

События

Подавляющее большинство функционала Node.js применяет асинхронную событийную архитектуру, которая использует специальные объекты

События Подавляющее большинство функционала Node.js применяет асинхронную событийную архитектуру, которая использует специальные
– эмиттеры для генерации различных событий, которые обрабатываются специальными функциями – обработчиками или слушателями событий.
Весь необходимый функционал сосредоточен в модуле events.
Объекты, которые генерируют события, – экземпляры класса EventEmitter.
С помощью функции eventEmitter.on() к определенному событию по имени цепляется функция обработчика. Причем для одного события можно указать множество обработчиков.

Слайд 38

События

Для примера определим следующий файл app.js:
Для генерации события выполняется функция emitter.emit().

События Для примера определим следующий файл app.js: Для генерации события выполняется функция emitter.emit().

Слайд 39

События

Передача параметров событию
При вызове события в качестве второго параметра в функцию emit

События Передача параметров событию При вызове события в качестве второго параметра в
можно передавать некоторый объект, который передается в функцию обработчика события:

Слайд 40

События

Наследование от EventEmitter
В приложении мы можем оперировать сложными объектами, для которых также

События Наследование от EventEmitter В приложении мы можем оперировать сложными объектами, для
можно определять события, но для этого их надо связать с объектом EventEmitter:

Слайд 41

Работа с файловой системой. Модуль fs

Чтение из файла
Допустим, в одной папке с

Работа с файловой системой. Модуль fs Чтение из файла Допустим, в одной
файлом приложения app.js расположен текстовый файл hello.txt с простейшим текстом, например «Hello World».
Для чтения файла в синхронном варианте применяется функция fs.readFileSync():
На выходе получаем считанный текст.

Слайд 42

Работа с файловой системой. Модуль fs

Для асинхронного чтения файла применяется функция fs.readFile():
Третий

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

Слайд 43

Работа с файловой системой. Модуль fs

Для чтения файла определим в файле app.js

Работа с файловой системой. Модуль fs Для чтения файла определим в файле app.js следующий код:
следующий код:

Слайд 44

Работа с файловой системой. Модуль fs

Запись файла
Для записи файла в синхронном варианте

Работа с файловой системой. Модуль fs Запись файла Для записи файла в
используется функция fs.writeFileSync(), которая в качестве параметра принимает путь к файлу и записываемые данные:
Также для записи файла можно использовать асинхронную функцию fs.writeFile():
В качестве вспомогательного параметра в функцию может передаваться функция обратного вызова, которая выполняется после завершения записи.

Слайд 45

Работа с файловой системой. Модуль fs

Пример:
Данные методы полностью перезаписывают файл.
Если надо

Работа с файловой системой. Модуль fs Пример: Данные методы полностью перезаписывают файл.
осуществить дозапись, то применяются методы fs.appendFile() / fs.appendFileSync().

Слайд 46

Работа с файловой системой. Модуль fs

Удаление файла
Для удаления файла в синхронном варианте

Работа с файловой системой. Модуль fs Удаление файла Для удаления файла в
используется функция fs.unlinkSync(), которая в качестве параметра принимает путь к удаляемому файлу:
Также для удаления файла можно использовать асинхронную функцию fs.unlink(), которая принимает путь к файлу и функцию, вызываемую при завершении удаления.

Слайд 47

Потоки данных

Объект Stream представляет поток данных.
Потоки бывают различных типов, среди которых

Потоки данных Объект Stream представляет поток данных. Потоки бывают различных типов, среди
можно выделить потоки для чтения и потоки для записи.
К примеру, при создании сервера используются потоки:
Параметры request и response, которые передаются в функцию, и с помощью которых мы можем получать данные о запросе и управлять ответом, как раз представляют собой потоки для чтения и для записи соответственно.

Слайд 48

Потоки данных

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

Потоки данных Используя потоки чтения и записи, можно считывать и записывать информацию
файл.
Поток записи
Для создания потока для записи применяется метод fs.createWriteStream(), в который передается название файла.
Запись данных производится с помощью метода write(), в который передаются данные.
Для окончания записи вызывается метод end().

Слайд 49

Потоки данных

Поток чтения
Для создания потока для чтения используется метод fs.createReadStream(), в который

Потоки данных Поток чтения Для создания потока для чтения используется метод fs.createReadStream(),
также передается название файла.
Сам поток разбивается на ряд кусков или чанков (chunk).
При считывании каждого такого куска, «автоматически» возникает событие data.

Слайд 50

Потоки данных

Пример:

Потоки данных Пример:

Слайд 51

Канал Pipe

Pipe – это канал, который связывает поток для чтения и поток

Канал Pipe Pipe – это канал, который связывает поток для чтения и
для записи и позволяет сразу считать из потока чтения в поток записи.
Рассмотрим пример с копированием данных из одного файла в другой.
Эта задача является довольно распространенной, и в этом случае каналы (pipe) позволяют нам сократить объем кода.

Слайд 52

Канал Pipe

Скопируем содержимое файла hello.txt в новый файл some.txt:
У потока чтения вызывается метод

Канал Pipe Скопируем содержимое файла hello.txt в новый файл some.txt: У потока
pipe(), в который передается поток для записи.

Слайд 53

Клиент-серверная архитектура приложения

Протокол HTTP предоставляет набор методов для указания целей запроса, отправляемого

Клиент-серверная архитектура приложения Протокол HTTP предоставляет набор методов для указания целей запроса,
серверу.
Эти методы основаны на дисциплине ссылок, где для указания ресурса, к которому должен быть применен данный метод, используется универсальный идентификатор ресурсов (Universal Resource Identifier, URI) в виде местонахождения ресурса (Universal Resource Locator, URL) или в виде его универсального имени (Universal Resource Name, URN ).
Протокол HTTP реализует принцип запрос/ответ.

Слайд 54

Клиент-серверная архитектура приложения

Запрашивающая программа–клиент инициирует взаимодействие с отвечающей программой–сервером, и посылает запрос,

Клиент-серверная архитектура приложения Запрашивающая программа–клиент инициирует взаимодействие с отвечающей программой–сервером, и посылает
содержащий:
метод доступа;
адрес URL;
версию протокола;
сообщение с информацией о типе передаваемых данных, информацией о клиенте, пославшем запрос, и, возможно, с содержательной частью (телом) сообщения.
Ответ сервера содержит:
строку состояния, в которую входит версия протокола и код возврата (успех или ошибка);
сообщение, в которое входит информация сервера, метаинформация и тело сообщения.
Соединение, как правило, открывает клиент, а сервер после отправки ответа инициирует его разрыв.

Слайд 55

Создание сервера

Для работы с сервером и протоколом HTTP в Node.js используется модуль

Создание сервера Для работы с сервером и протоколом HTTP в Node.js используется
http.
Чтобы создать сервер, следует вызвать метод http.createServer():
Данный метод возвращает объект http.Server.
Чтобы сервер мог прослушивать и обрабатывать входящие подключения, у объекта сервера необходимо вызвать метод listen().

Слайд 56

Создание сервера

Для обработки подключений можно передать особую функцию:
Эта функция принимает два параметра:
request

Создание сервера Для обработки подключений можно передать особую функцию: Эта функция принимает
– хранит информацию о запросе;
response – управляет отправкой ответа.

Слайд 57

Создание сервера

Request
Параметр request позволяет получить информацию о запросе и представляет объект http.IncomingMessage.

Создание сервера Request Параметр request позволяет получить информацию о запросе и представляет

Отметим некоторые основные свойства этого объекта:
headers: возвращает заголовки запроса;
method: тип запроса (GET, POST, DELETE, PUT);
url: представляет запрошенный адрес.

Слайд 58

Создание сервера

Например, определим следующий файл app.js:
Запустим его и обратимся в
браузере по

Создание сервера Например, определим следующий файл app.js: Запустим его и обратимся в браузере по адресу http://localhost:3000/index.html:
адресу
http://localhost:3000/index.html:

Слайд 59

Создание сервера

Response
Параметр response управляет отправкой ответа и представляет объект http.ServerResponse.
Среди его

Создание сервера Response Параметр response управляет отправкой ответа и представляет объект http.ServerResponse.
функциональности можно выделить следующие методы:
statusCode: устанавливает статусный код ответа;
statusMessage: устанавливает сообщение, отправляемое вместе со статусным кодом;
setHeader(name, value): добавляет в ответ один заголовок;
write: пишет в поток ответа некоторое содержимое;
writeHead: добавляет в ответ статусный код и набор заголовков;
end: сигнализирует серверу, что заголовки и тело ответа установлены, в итоге ответ отсылается клиента. Данный метод должен вызываться в каждом запросе.

Слайд 60

Создание сервера

Например, изменим файл app.js следующим образом:

Создание сервера Например, изменим файл app.js следующим образом:

Слайд 61

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

Node.js не имеет встроенной системы маршрутизации адресов запросов к серверу.
Обычно она

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

Слайд 62

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

Например:

Маршрутизация Например:

Слайд 63

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

В данном случае обрабатываются три маршрута и неправильный ввод маршрута.

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

Слайд 64

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

Переадресация предполагает отправку статусного кода:
301 (постоянная переадресация)
302 (временная переадресация)
А также

Переадресация Переадресация предполагает отправку статусного кода: 301 (постоянная переадресация) 302 (временная переадресация)
заголовка Location, который указывает на новый адрес.

Слайд 65

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

Например:

Переадресация Например:

Слайд 66

Отправка файлов

Отправка статических файлов – частая задача в работе веб-приложения.
Пусть в

Отправка файлов Отправка статических файлов – частая задача в работе веб-приложения. Пусть
каталоге проекта у нас будут три файла:
index.html   about.html
Наша задача будет заключаться в том, чтобы отправить их содержимое пользователю.

Слайд 67

Первый способ отправки файлов

Для этого может применяться метод fs.createReadStream().
Затем с помощью метода

Первый способ отправки файлов Для этого может применяться метод fs.createReadStream(). Затем с
pipe() мы можем связать считанные файлы с потоком записи, то есть объектом response.

Слайд 68

Первый способ отправки файлов

Файл app.js :

Первый способ отправки файлов Файл app.js :

Слайд 69

Первый способ отправки файлов

Метод fs.createReadStream() создает поток для чтения – объект fs.ReadStream.
Для

Первый способ отправки файлов Метод fs.createReadStream() создает поток для чтения – объект
получения данных из потока вызывается метод pipe(), в который передается объект интерфейса stream.Writable или поток для записи (объект http.ServerResponse).
Запустим приложение и в браузере обратимся по адресу:

Слайд 70

Первый способ отправки файлов

В данном случае отправляются файлы html, но подобным образом

Первый способ отправки файлов В данном случае отправляются файлы html, но подобным
можно отправлять разные файлы.
Например, создадим новый файл styles.css со следующим содержимым:
Добавим стили на станице index.html в :
И затем обратимся к index.html:

Слайд 71

Второй способ отправки файлов

Второй способ представляет чтение данных с помощью функции fs.readFile()

Второй способ отправки файлов Второй способ представляет чтение данных с помощью функции
и отправка с помощью метода response.end():

Слайд 72

Шаблоны

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

Шаблоны Вместо статичного содержимого можно применять шаблоны, вместо которых в файл будет
какой-то определенный текст.
Например, изменим файл index.html следующим образом:
Вместо конкретного содержимого здесь определены прейсхолдеры {header} и {message}, вместо которых может вставляться любой текст.

Слайд 73

Шаблоны

Изменим файл app.js:

Шаблоны Изменим файл app.js: