Node.js
Памятка по основам синтаксиса JavaScript для Node.js в примерах.
Переменные
Переменная var поддерживает любую область видимости и ее возможно объявить повторно (считается устаревшим методом и рекомендуется не использовать).
varVariable // Uncaught ReferenceError: varVariable is not defined (не определена)
if true
varVariable // true
varVariable // 123
Переменная let позволяет изменять содержимое с другим типом данных (в отличии от const), но ограничина областью видимости (в отличии от var).
letVariable // Uncaught ReferenceError: letVariable is not defined
if true
letVariable // Uncaught ReferenceError: letVariable is not defined
letVariable
letVariable = 123
letVariable
Переменная константа const требует обязательной инициализации во время объявления, и не позволяет изменять значение переменной после ее объявления.
constVariable = '123' // Uncaught TypeError: Assignment to constant variable (ошибка присвоения значения к постоянной переменной)
Типы данных
typeof 32 // number
typeof 32 // number
typeof 123n // bigint
typeof 'text' // string
typeof true // boolean
typeof false // boolean
typeof null // object
typeof // object
typeof // object
typeof // function
typeof 'id' // symbol
Преобразовать аргумент в число. Возвращает NaN, если преобразование невозможно.
"123" // 123
"123.45" // 123.45
"abc" // NaN
undefined // NaN
true // 1
false // 0
null // 0
Преобразовать строку в целое число. Прекращает чтение, как только встречает нецифровой символ.
"123abc" // 123
"12.34" // 12
"abc123" // NaN
Преобразовать строку в число с плавающей точкой.
"123.45abc" // 123.45
"abc123.45" // NaN
Преобразовать значение в строку.
123 // "123"
true // "true"
123 // "123"
true // "true"
false // "false"
null // "null"
undefined // "undefined"
Преобразовать значение в булевое (логическое) значение. Все значения, кроме 0, null, NaN, undefined и пустой строки, преобразуются в true.
123 // true
"Hello" // true
0 // false
!0 // true
!!0 // false
null // false
NaN // false
undefined // false
"" // false
Функции
2,2 // 4
1,100 // Например, 44
Условия
0 // 0 равно 0
5 // 5 меньше 10
15 // 15 больше или равно 10
'test' // Переданное значение - test - не подходит под заданные условия
Однострочный формат условия ?:, который подходит для использования в теле переменной
input === 1 ? true : false // true
input = 2
input === 1 ? true : false // false
Проверить одно значение сразу на большое количество условий с помощью конструкции switch
1 // Понедельник
5 // Пятница
7 // Воскресенье
8 // Неправильно задан параметр
Обработка ошибок
10, 2
// 5
// Блок finally выполняется всегда
10, 0
// Ошибка: на ноль делить нельзя
// Блок finally выполняется всегда
Массивы
Классический массив и его методы.
array // Проверка, является ли переменная массивом (true)
array = 1 // Изменить содержимое элемента в массиве по индексу
// сортировка по умолчанию: [ 1, 2, 3 ]
// Поменять порядок следования: [ 3, 2, 1 ]
array + array + array // 6
array // undefined (не определено)
array = 4 // Добавить новый элемент в массив по индексу
5 // Добавить новый элемент с конца
array // 5
3,5 // Вывести содержимое массива с 4-го по 5-й индекс: [ 4, 5 ]
0 // Добавить элемент(ы) (через запятую) в начало массива
// Удалить первый элемент из массива
// Удалить последний элемент из массива
array // Вывести содержимое последнего элемента в массиве
1 // Выводит индекс первого вхождения элемента в массив, или -1, если элемент не найден
Вложенный массив, а также методы фильтрации и объединения:
// Добавить новый элемент в массив
// [ 'blue', 'green' ]
// объеденить два массива
// [ 'red', 'blue', 'green', 'blue', 'green' ]
// Метод reduce выполняет функцию для каждого элемента массива, чтобы получить одно итоговое значение (сумму)
accumulator + current, 0 // 3
Объекты
Преобразовать объект в массив и наоборот:
obj.b // 2
arr // 2
arr // { a: 1, b: 2, c: 3 }
Объект представляет из себя список пар (ключ-значение), разделенного запятыми. Используя переменную const при объявлении объектов, возможно изменять содержимое дочерних элементов.
box.height // 8
box.style // { fg: 'white', bg: 'black' }
box.style.fg // white
box.style.fg = 'blue'
box.style.fg // blue
Объекты и вложенные массивы JavaScript могут содержать дочерние массивы внутри [] и вложенные объекты внутри {}.
Конвертация в JSON:
Методы объекта назначаются через функции
1
// 9
2
// 11
Оператор return используется для выхода из функции (т.е. последующий код не читается), который возвращает значение указанное после ключевого слова.
Циклы
Примеры циклов взяты из проекта multranslate, для проверки всех строк в массиве и увеличения количества видимых строк с учетом autowrap. Имеется две реальных строки, необходимо узнать количество виртуальных строк с учетом длинны символов в строке. Например, если максимальная длинна одной строки составляет, 36, то на одну реальную строку в 92 символа приходится дополнительно еще 2 виртуальных. Количество найденных виртуальных строк прибавляется к изначально зафиксированному значению количества всех реальных строк.
// На входе 2 строки, разделенные символом \r
// Фиксируем текущее максимальное количество строк и длинну символов в строке с учетом размеров окна
// Разбиваем текст на массив из строк
// Забираем реальное количество строк (2)
// Вывести количество строк в каждой строке массива
item.length // [ 13, 92 ]
Классический цикл for итерирует числами с типом данных number (int / integer). С каждой интерацией объявленное значение (let i = 0) увеличивается на заданное количество (i++ - на единицу), цикл завершается в случае успешного соблюдения условия (i < bufferLine.length).
for ; i < bufferLine.length; i++
` ` // 6 36 3
// Уменьшаем значение на 1, для проверки в других циклах
viewLines--
for ; i < bufferLine.length; i++
` ` // 6 36 4
viewLines -= 2
Цикл for..in итерирует по индексам массива, с типом данных string. Сколько элементов в массиве (bufferLine.length), столько и будет индексов (отсчет начинается с нуля).
for in bufferLine
` ` // 6 36 4
viewLines -= 2
Цикл for..of итерирует по элементам массива, с уникальным типом данных каждого элемента в массиве.
for of array
// number
// string
// object
for of bufferLine
` ` // 6 36 4
viewLines -= 2
Метод массива forEach выполняет указанную функцию для каждого элемента в массиве.
` ` // 6 36 4
viewLines -= 2
Цикл while Выполняет тело цикла {} до тех пор, пока условие истинно
while i < bufferLine.length
` ` // 6 36 4
viewLines -= 2
Цикл do..while сначала выполняет тело цикла, а затем проверяет условие, это гарантирует, что интерация будет выполнена как минимум один раз.
i = 0
do while i < bufferLine.length
` ` // 6 36 4
Операторы:
continue- прерывает текущую интерацию, для продолжения цикла с следующим значениемbreak- прерывает и завершает цикл
for of arr
// Начало 0-й итерации
// Конец 0-й итерации
// Начало 1-й итерации
// Пропустить оставшуюся часть кода и перейти к следующей итерации
// Начало 2-й итерации
// Полностью выйти из цикла
Асинхронные операции
Promise (промис) — это объект, который используется для обработки асинхронных операций, позволяя работать с результатами, когда они станут доступны, не блокируя основной поток выполнения. Он может находиться в одном из трех состояний:
Pending(Ожидание): Операция только отправлена на выполнение или еще выполняется.Fulfilled(Выполнен): Операция завершилась успешно.Rejected(Отклонен): Операция завершилась с ошибкой.
С помощью ключевых слов resolve (разрешить/успех) и reject (отклонить/ошибка) производится управление возвращаемым результатом выполнения.
resulterror
Метод then используется для обработки успешного выполнения промиса (в состоянии fulfilled).
Метод catch используется для обработки ошибок или отказов промиса (в состоянии rejected).
async — это ключевое слово, которое делает функцию асинхронной и позволяет использовать await, чтобы приостановить выполнение до тех пор, пока все промисы не будут выполнены.
await — это ключевое слово, которое используется внутри асинхронной функции (async). Оно заставляет ждать выполнения промиса и возвращает его результат.
// Импортируем функцию exec из модуля child_process, которая позволяет запускать команды операционной системы
// Основная функция выполнения команды ping в промис
// Асинхронная функция создания промисов и получения результатов
'192.168.3.0'
Использовать внешнюю библиотеку ping: npm install ping
// Асинхронная функция отправки команды ping через библиотеку
// Функция возврата промисов вручную без async
'192.168.3.0'
await Promise.all() - дожидается успешного выполнения всех запросов. await Promise.allSettled() - дожидается выполнения всех запросов не зависимо от успеха (возвращает статус и результат). await Promise.race() - дожидается первого успешного выполнения, что бы получить результат от него не зависимо от его успеха.
Регулярные выражения
Преобразовать строку в массив из букв (char).
Метод split() используется для преобразования строки в массив.
line = "1,2,3,4,5" // '1,2,3,4,5'
arr = "," // [ '1', '2', '3', '4', '5' ]
Метод join() используется для объединение массива в строку.
// Собирает массив в строку: '2,3'
" - " // '2 - 3'
Метод match() используется для поиска совпадений с регулярным выражением в строке. Он возвращает массив с найденными совпадениями или null, если совпадений не найдено.
/текст/ // Получить содержимое первого совпадения
/текст/.index // Возвращает порядковый индекс первого совпадения в тексте (19)
/текст/i // Возвращает только первое совпадение без учета регистра
/текст/gi // Получить массив всех совпадений: [ 'Текст', 'текст' ]
stringForRegex = "2024-10-25"
/--/ // Группа захвата, которая возвращает полное совпадение, а также значения отдельных групп
// [ '2024-10-25', '2024', '10', '25', index: 0, input: '25-10-2024', groups: undefined ]
Метод search() возвращает только индекс первого совпадения.
"Текст для проверки текста"'про' // 10
Метод replace() заменяет найденные совпадения в строке на другие значения.
stringForRegex = "Текст для замены"
/для/, "после" // 'Текст после замены'
/^т/i, "Этот т" // 'Этот текст для замены'
/$/, "!" // 'Текст для замены!'
//, "$1 только" // 'Текст только для замены'
/\s[а-яА-Я]{3}/, "" // 'Текст замены'
/\s\p{L}+$/u, " кириллицы" // 'Текст для кириллицы'
stringForRegex = "Text for regex"
/\s\w{3}/, "" // Используется для замены любых латинских букв: 'Text regex'
/\s[a-zA-Z_]{3}/, "" // эквивалент \w
stringForRegex = "2024-10-25"
stringForRegex = /--/,"$3.$2.$1" // Поменять порядок через группы захвата: '25.10.2024'
/\d{2}\./g, "11." // Заменяет найденные две идущие цифры подряд: '11.11.2024'
/\d{4}/, "2025" // Заменяет четыре идущие цифры подряд: '25.10.2025'
/20\d+/, "2025" // Заменяет 20 и любые идущие за ним цифры: '25.10.2025'
/10.+/g, "11.2025" // Заменяет 10 и любое количетво символов идущее за ним: '25.11.2025'
/\d{2,4}/g, "11" // Заменяет найденные цифры следующие в порядке от 2 до 4: ('11.11.11')
/[45]/g, "1" // Заменить 4 или 5 на 1: '21.10.2021'
Математические вычисления
9, 10 // Получить наименьшее значение двух чисел: 9
9, 10 // Получить максимальное значение двух чисел: 10
10 / 3 // Округлить в меньшую сторону: 3
10/3 // Откруглить в большую сторону: 4
49 // Отбрасывание дробной части: 4
45 // Округление до ближайшего целого: 5
445 // Округление до ближайшего целого: 4
505 // Ближайшее число с плавающей точкой одинарной точности: 5.050000190734863
// Псевдослучайное число между 0 и 1, например, 0.2309471255442206
-7 // Получить абсолютное значение: 7
-3 // Определение знака числа (-1, 0, 1): -1
2, 3 // Возведение в степень: 8
16 // Квадратный корень: 4
27 // Кубический корень: 3
2, 4 // Целочисленное 32-битное умножение: 8
1 // Количество ведущих нулей в 32-битном представлении: 31
Express
Создаем директорию, инициализируем проект и устанавливаем зависимости
&&
Серверная часть API сервера в файле server.js
// Middleware для парсинга JSON данных в теле запроса
// Обработка GET запроса с параметрами в пути и заголовками
'/user/:id',
// Обработка POST запроса с данными в теле запроса и заголовками
'/user',
// Запуск сервера на порту 3000
PORT,
Запуск сервера
Axios
Клиентская часть для работы с API
Пример GET запроса
// URL сервера
// Пример GET запроса с параметром id в пути и кастомным заголовком
await 1, 'Value'
// GET Ответ: {
// message: 'GET запрос для пользователя с ID 1',
// customHeader: 'Value'
// }
Пример POST запроса
// Пример POST запроса с телом и заголовком авторизации
await 'KEY', 'Alex', 29
// POST Ответ: { message: 'Авторизация не пройдена, переданный токен: Bearer KEY' }
await 'TOKEN', 'Alex', 29
// POST Ответ: { name: 'Alex', age: 29 }
Fetch
result // { userId: 1, id: 1, title: 'delectus aut autem', completed: false }
result // '{"userId":1,"id":1,"title":"delectus aut autem","completed":false}'
Cheerio
Cheerio - это библиотека для работы с HTML и XML в Node.js
Подключаем библиотеки и получаем содержимое страницы с помощью Axios через Proxy
// Имя агента в заголовке запросов (вместо axios)
// Создание экземпляра Axios с использованием конфигурации Proxy
// Отправляем запрос
// Декодируем ответ
html = response.data, 'utf8'
Вытаскиваем данные с помощью Cheerio
// Обращаемся к элементу div (не обязательно указывать название элемента) с id="ws" > div с id="index" > элемент "tbody" (таблица) > элемент "tr" (строки)
'div#ws #index tbody tr'.length // 171
// Исключить из вывода строку с class="backgr" (загловки столбцов)
'#ws #index tbody tr''.backgr'.length // 170
// Получить содержимое первого элемента "tr" в формате HTML, строки или текста без тегов
'#ws #index tbody tr''.backgr'0
'#ws #index tbody tr''.backgr'0
'#ws #index tbody tr''.backgr'0
// Получить содержимое элемента по частичному совпадению
'#ws #index tbody tr''.backgr''td:contains("слово")''\n',''
// 'Мужское слово (2024) WEB-DLRip'
// Получить содержимое второго элемента по индексу в строке (столбцe)
'#ws #index tbody tr''.backgr'0'td'1'\n',''
// 'Launcher for Zapret [v 1.3] (2024) PC | Portable'
// Получить содержимое атрибута "href" из элемента с классом "downgif"
'#ws #index tbody tr''.backgr'0'td a.downgif''href'
// '//d.rutor.info/download/1008549'
// Получить содержимое атрибута "href" из второго элемента "a" в элементе "td"
'#ws #index tbody tr''.backgr'0'td a:nth-child(2)''href'
// 'magnet:?xt=urn:btih:f1ca88b9421b243b6cb3d4da90e8fe133f381817&dn=rutor.info&tr=udp://opentor.net:6969&tr=http://retracker.local/announce'
// Фильтруем все элементы по частичному совпадению
'#ws #index tbody tr''.backgr'
// [
// '29 Окт 24 | Критик / The Critic (2023) WEB-DLRip 1080p от ExKinoRay | P | 6.10 GB | 1 4',
// '28 Окт 24 | Критик / The Critic (2023) WEB-DLRip | P | 1.46 GB | 58 22',
// '28 Окт 24 | Критик / The Critic (2023) WEB-DLRip-AVC от DoMiNo & селезень | P | 1.46 GB | 64 19',
// '28 Окт 24 | Критик / The Critic (2023) WEB-DL 1080p | P | RGB | 1 | 5.63 GB | 115 54'
// ]
// Собираем объект из всех элементов
'#ws #index tbody tr''.backgr'
// Конвертируем объект в формат JSON
torrents, null, 2
// [
// {
// "Date": "29 Окт 24",
// "Name": "Launcher for Zapret [v 1.3] (2024) PC | Portable",
// "Link": "https://rutor.info/torrent/1008549/launcher-for-zapret-v-1.3-2024-pc-portable",
// "DownloadLink": "https:////d.rutor.info/download/1008549",
// "Magnet": "magnet:?xt=urn:btih:f1ca88b9421b243b6cb3d4da90e8fe133f381817&dn=rutor.info&tr=udp://opentor.net:6969&tr=http://retracker.local/announce"
// },
// ...
// ]
Puppeteer
Puppeteer — это библиотека, которая предоставляет API для автоматизации любых действий в браузерах Google Chrome и Mozilla Firefox через протокол Chrome DevTools и WebDriver BiDi.
&& && &&
Пример получения списка файлов раздачи с сайта RuTor.
// Запускаем браузер и открываем новую пустую страницу
// Открываем страницу с ожиданием загрузки 60 сек
await `https://rutor.info/torrent/`,
await
// Дождаться загрузки результатов
// const elementHandle = await page.waitForSelector('#files')
// Ищем элемент с идентификатором #files и проверяем, что элемент существует его содержимое не содержит текст загрузки
await ,
// Забираем результат после успешной проверки
// Закрываем браузер
await
// Разбиваем полученные результаты на массив из строк (split) исключая первую строку (slince)
// Регулярное выражение для разбиения строки на название и размер
for of lines
torrents, null, 2
Пример создания API для получения результатов проверки скорости интернета в формате JSON через Ookla SpeedTest.
await `https://www.speedtest.net`,
// Дождаться, когда кнопка "Go" станет доступной
await 'span[data-testid="start-button"]'
// Возвращаем массив всех элементов span на странице с их текстом
await
// Находим и нажимаем на кнопку
await
// Функция для получения результата
// Цикл для проверки получения результата
// Проверяем, что результат содержит в начале строки 'http'
while !'http'
await
// Считываем данные из полученного url с помощью Fetch
// Вытаскиваем JSON из HTML страницы
resultObj.result.id // 16947429430
resultObj.result.download // 7169 (7.17)
resultObj.result.upload // 4939 (4.94)
resultObj.result.idle_latency // 171 (ping)
