Friday, September 5, 2025

"Изучаем Node. Переходим на сторону сервера (2-е издание)" Пауэрс Ш.

 

Book notes:

“Версию Node можно проверить следующей командой: node -v

“Объект process предоставляет доступ к информации как о среде Node, так и о среде выполнения программы. Для получения информации мы воспользуемся параметром командной строки -p, который выполняет сценарий и возвращает полученный результат”

“Node поддерживает чтение и запись 8-, 16- и 32-разрядных целых чисел со знаком и без, а также вещественных чисел одинарной и двойной точности. Для всех типов, кроме 8-разрядных целых чисел, также можно выбрать формат с прямым (little-endian) или обратным (big-endian) порядком байтов. Несколько примеров поддерживаемых функций: 1) buffer.readUIntLE(): чтение значения с заданным смещением и прямым порядком байтов. 2) buffer.writeUInt16BE(): запись 16-разрядного целого без знака с заданным смещением и обратным порядком байтов. 3) buffer.readFloatLE(): чтение вещественного числа одинарной точности с заданным смещением и прямым порядком байтов. 4) buffer.writeDoubleBE(): запись 64-разрядного вещественного числа двойной точности с заданным смещением и обратным порядком байтов.”

“Но если вы интересуетесь разработкой дополнений для Node, вам придется очень близко познакомиться с libuv. Начать можно с введения в libuv (https://nikhilm.github.io/uvbook/basics.html).”

“Стоит немного поскрести многие базовые объекты Node, и под оболочкой обнаружится EventEmitter. Каждый раз, когда вы видите объект, генерирующий событие, которое обрабатывается функцией on, знайте: перед вами EventEmitter. Понимание того, как работает класс EventEmitter, и умение его использовать — две важнейшие составляющие программирования для Node… Класс EventEmitter обеспечивает асинхронную обработку событий в Node.”

“В браузере для работы с таймерами существуют setTimeout() и setInterval(); эти функции также доступны и в Node. Они не совсем равноценны, потому что браузер использует цикл событий, реализуемый на уровне ядра браузера, а цикл событий Node реализуется библиотекой C++, libuv, но в основном различия между ними несущественны.”

“Функция setImmediate() создает событие, но это событие имеет более высокий приоритет, чем события, созданные setTimeout() и setInterval(). Однако при этом оно не превосходит по приоритету события ввода/вывода и с ним не связывается собственный таймер. Событие setImmediate() генерируется после всех событий ввода/вывода, до событий таймера, и в текущей очереди событий. Если вызвать его из функции обратного вызова, то оно помещается в следующий цикл событий после завершения того цикла, в котором оно было вызвано. Фактически эти функции позволяют добавить событие в текущий или в следующий цикл событий без лишних таймеров. Этот способ эффективнее setTimeout(callback, 0), потому что он превосходит по приоритету другие события таймеров. Он похож на другую функцию — process.nextTick(), не считая того, что функция обратного вызова process.nextTick() активизируется после завершения текущего цикла событий, но до добавления каких-либо новых событий ввода/ вывода”

“REPL — удобный интерактивный инструмент, который облегчает разработчику жизнь. REPL позволяет не только опробовать код JavaScript перед включением его в файлы, но и создавать приложения в интерактивном режиме, с сохранением результатов после завершения работы. Другая полезная особенность REPL — возможность создания специализированной версии REPL, способной исключать нежелательные ответы undefined, осуществлять предварительную загрузку модулей, изменять приглашение или используемую функцию eval и делать многое другое.”

“Так как многие объекты в Node реализуют потоковый интерфейс, все потоки в Node обладают базовой функциональностью: 1) Изменение кодировки потоковых данных вызовом setEncoding.  2) Проверка возможности чтения и (или) записи данных в поток.  3) Перехват событий потоков (например, получения данных или закрытия подключения) с назначением функций обратного вызова для каждого события.  4) Приостановка и возобновление потока.  5) Перенаправление данных из потока для чтения в поток для записи.”

“Модуль Node File System (fs) предоставляет всю функциональность, необходимую для работы с файловой системой независимо от операционной системы.”

“Кроме многочисленных функций, модуль File System поддерживает четыре класса:  1) fs.FSWatcher — поддержка событий для отслеживания изменений в файле.  2) fs.ReadStream — поток для чтения.  3) fs.WriteStream — поток для записи.  4) fs.Stats — информация, возвращаемая функциями *stat.”

“Объект fs.Stats возвращается при использовании функций fs.stat(), fs.lstat() и fs.fstat(). Он может использоваться для проверки существования файла (или каталога), но также возвращает информацию о том, является ли объект файловой системы файлом/каталогом/сокетом домена UNIX, какие разрешения связаны с файлом, время последнего обращения или модификации объекта и т. д”

fs.readFile() или fs.writeFile() (или их синхронные аналоги). Эти функции открывают файл, выполняют чтение или запись, после чего закрывают файл”

“Поток для чтения создается вызовом fs.createReadStream() с передачей пути и объекта options или же с включением описания файла в options без указания пути. То же можно сказать о потоках для записи, создаваемых вызовом fs.createWriteStream(). В обоих случаях поддерживается объект options.”

“Сокет (socket) представляет собой конечную точку обмена данными, а сетевой сокет — конечную точку обмена данными между приложениями, работающими на двух разных компьютерах в сети. Данные, передаваемые между сокетами, образуют поток (stream). Данные в потоке могут передаваться либо в виде двоичных данных в буфере, либо в виде строки в кодировке Юникод. Оба типа данных передаются в форме пакетов: частей данных, разделенных на блоки сходного размера. Также существует специальная разновидность пакетов — завершающий пакет (FIN), отправляемый сокетом как сигнал о завершении передачи.”

“TCP требует выделенного соединения между двумя конечными точками. UDP — протокол, не требующий соединения; это означает, что соединение между двумя конечными точками не гарантировано. По этой причине протокол UDP по надежности и степени защиты от ошибок уступает TCP. С другой стороны, UDP обычно работает быстрее TCP, что делает его более популярным для задач реального времени и таких технологий, как VoIP (Voice over Internet Protocol), в которых требования к соединению TCP могут отрицательно повлиять на качество сигнала.”

“Безопасный, защищенный от несанкционированного вмешательства обмен данными между клиентом и сервером осуществляется через протокол SSL (Secure Sockets Layer) и его обновленный вариант TLS (Transport Layer Security). Уровень TLS/SSL реализует шифрование данных для протокола HTTPS, который будет рассмотрен в следующем разделе. Но прежде чем браться за программирование для HTTPS, необходимо подготовить среду разработки”

“Node предоставляет криптографический модуль Crypto, открывающий интерфейс к функциональности OpenSSL. В него включены обертки для функций хеширования OpenSSL, HMAC, шифрования, дешифрования, подписи и верификации. Этот компонент Node достаточно прост в использовании, но он основан на предположении, что разработчик Node хорошо знает OpenSSL и все используемые функции”

“В самом распространенном используется метод spawn. Он запускает команду в новом процессе, передавая ей любые аргументы. Между родительским приложением и дочерним процессом создаются каналы (pipes) для stdin, stdout и stderr”

“Кроме порождения дочернего процесса функцией child_process.spawn(), для выполнения команды также можно воспользоваться функциями child_ process.exec() и child_process.execFile(). Метод child_process.exec() похож на child_process.spawn(), не считая того, что spawn() начинает возвращать поток сразу же после запуска программы, как видно из листинга 8.1. Функция child_process.exec(), как и child_process. execFile(), буферизирует результаты. Однако exec() порождает командный интерпретатор для управления приложением, тогда как child_process. execFile() запускает процесс напрямую. Это делает функцию child_process. execFile() более эффективной по сравнению как с child_process.spawn() с включенным режимом shell, так и с child_process.exec(). В первом параметре child_process.exec() или child_process.execFile() передается либо команда (для exec()), либо файл и его местоположение (execFile()); второй параметр содержит объект options для команды; в третьем параметре передается функция обратного вызова. Функция обратного вызова получает три аргумента: error, stdout и stderr. При отсутствии ошибок данные буферизируются в stdout.”

“Последний метод дочерних процессов — child_process.fork(). Эта разновидность spawn() предназначена для порождения процессов Node. Вызов child_process.fork() отличается от других тем, что он создает реальный канал передачи данных дочернему процессу. Однако обратите внимание на то, что каждому процессу требуется новый экземпляр V8, а это приводит к дополнительным затратам времени и памяти.”

“Строгий режим сильно влияет на работу кода. В частности, он выдает ошибки, если переменная не определяется перед использованием; параметр функции может объявляться только единожды; переменная не может использоваться в eval-выражении на одном уровне с вызовом eval, и т. д”

“MongoDB — самая популярная база данных, используемая в приложениях Node. Эта система относится к категории документных баз данных. Документы кодируются в формате BSON — двоичной разновидности JSON (что, вероятно, объясняет его популярность среди разработчиков JavaScript). В MongoDB место записи таблицы занимает документ BSON, а место таблицы — коллекция.”

“Объект MongoClient — тот объект, который вы будете использовать чаще всего для подключения к базе данных. Обратите внимание на заданный номер порта (27017): это порт по умолчанию для системы MongoDB”

“Memcached в основном используется для кэширования запросов к данным, чтобы ускорить последующие обращения к ним. Система также хорошо справляется с распределенным кэшированием, но поддержка более сложных данных в ней ограничена. Она хорошо работает в приложениях, выдающих большое количество запросов на выборку, но не столь эффективно проявляет себя в приложениях с многочисленными операциями чтения и записи. Redis — отличный вариант для приложения второго типа. Кроме того, данные Redis могут сохраняться, и система обладает большей гибкостью, чем Memcached, — особенно в поддержке различных типов данных. Однако, в отличие от Memcached, Redis работает только на одной машине.”

“Те же факторы следует учитывать при сравнении Redis с Cassandra. В Cassandra, как и в Memcached, реализована поддержка кластеров. С другой стороны, как и в Memcached, поддержка структур данных в Cassandra ограничена. Система хорошо подходит для выдачи ситуативных запросов — сценарий использования, плохо подходящий для Redis. С другой стороны, система Redis проста в использовании, незатейлива и обычно работает быстрее Cassandra. По этим и другим причинам система Redis пользуется большей популярностью среди разработчиков Node.”

“Чтобы установить точку прерывания в коде, вставьте команду debugger прямо в код”

“Чтобы приступить к отладке приложения, укажите параметр debug при запуске приложения: node debug application

“Модульное тестирование — метод изоляции компонентов приложения для тестирования. Многие тесты, содержащиеся в подкаталоге tests модулей Node, являются модульными. Все тесты в подкаталоге test установки Node тоже являются модульными. Многие из этих тестов были построены с использованием модуля Assert”

“Тестовые утверждения проверяют значение некоторых выражений; конечным результатом такой проверки является логическое значение true или false.”

“Nodeunit предоставляет способ сценарного программирования тестов. Все запрограммированные тесты выполняются последовательно, а вывод результатов координируется. Чтобы использовать модуль Nodeunit, установите его глобально с использованием npm: [sudo] npm install nodeunit -g

best free sudoku app without ads iphone (promo) 


No comments:

Post a Comment

"Пам’ятай: паролі, дні народження, важливі дати і все, що ще не забув" Н. Делліс

  швидкочитання (промо) Нотатки з книги: “найліпший спосіб запамʼятати будь-що - перетворити його на уявний образ.” “увага становить ВЕЛИЧЕ...