Учебное пособие по Node Streams с примером

Учебное пособие по Node Streams с примерами является сегодня ведущей темой. Потоки — это наборы данных, подобные массивам или строкам. Разница между массивами и потоками заключается в том, что потоки могут быть недоступны сразу, и они не должны помещаться в памяти. Эта функция делает потоки более мощными при работе с огромными объемами данных или данными, поступающими из внешнего источника по частям. Многие из встроенных модулей в Node реализуют потоковый интерфейс. Таким образом, данные Stream не доступны сразу, но они доступны в определенный момент в виде данных фрагментов. Вот почему это полезно для разработки потокового веб-приложения, такого как Netflix или Youtube.

Если вы хотите узнать больше о Node.js, ознакомьтесь с этим курсом NodeJS — Полное руководство (включая MVC , REST API, GraphQL)

Учебное пособие по потокам узлов с примером

Я использую node.js версии v11.3.0, и ваша версия может быть v10, но здесь это не имеет значения. Stream — это абстрактный интерфейс для работы с потоковыми данными в Node.js. Модуль stream предоставляет базовый API, который упрощает создание объектов, реализующих интерфейс потока.

Потоки могут быть доступны для чтения, записи или и того, и другого. Все потоки являются экземплярами EventEmitter .

Следующий оператор может получить доступ к модулю потока.

 const stream = require ('stream'); 

Почему потоки

Потоки в первую очередь обеспечивают следующие преимущества.

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

Типы потоков

Там четыре основных типа потоков в Node.js:

  • Возможность записи — потоки, в которые могут быть записаны данные (например, fs.createWriteStream () ).
  • Readable — потоки, из которых можно читать данные (например, fs.createReadStream () ).
  • Duplex — потоки, оба читаемые и с возможностью записи (например, net.Socket ).
  • Transform Duplex потоки, которые могут изменять или преобразовывать данные по мере их записи и чтения

Давайте рассмотрим базовый простой пример потоков модуля файловой системы.

Создайте папку проекта с помощью следующей команды.

 mkdir streams 

Войдите в эту папку и создайте файл с именем server.js и добавьте следующий код.

//сервер. jsconst http = require ('http') const fs = require ('fs') const server = http.createServer (function (req, res) {fs.readFile ('data.txt', (err, data) => {  res.end (data)})}) server.listen (3000, () => {console.log ('сервер запущен')}) 

Здесь мы использовали http-модуль для создания веб-сервера, а также импортировали модуль с именем fs, который является модулем файловой системы для приложений node.js.

Когда сервер запускается, мы читаем содержимое файла data.txt и отправляем ответ на эти данные клиенту.

Итак, мы можем видеть вывод внутри браузера.

Сохраните этот файл, а также создайте еще один файл в корневом каталоге с именем data.txt и добавьте в него следующий код.

//data.txtnode streamsfile streams 

Перейдите в терминал и запустите сервер узла, используя следующую команду.

 node server 

Переключитесь в браузер и перейдите по этому URL-адресу: http://localhost: 3000/

Мы можем видеть содержимое файла data.txt

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

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

Мы можем использовать потоки в приведенном выше примере следующим образом.

// server.jsconst http = require ('http') const fs = require ('fs') const server = http.createServer ((req, res) => {const stream = fs.createReadStream ('data.txt') stream.  pipe (res)}) server.listen (3000, () => {console.log ('Node.js stream on port 3000');}); 

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

# Пример 2

Давайте возьмем второй пример Node.js Stream. Напишите следующий код внутри файла server.js.

//server.jsconst fs = require ('fs') let data = '' const readerStream = fs.createReadStream ('data.txt'  ) readerStream.setEncoding ('UTF8') readerStream.on ('data', (chunk) => {data + = chunk}) readerStream.on ('end', () => {console.log (data)})  readerStream.on ('error', (err) => {console.log (err.stack)}) console.log ('Node readerStream'); 

Здесь мы получаем вывод внутри терминал, потому что мы не использовали веб-сервер. Этот пример является экземпляром узла eventemitter .

  • data — Это событие запускается, когда есть данные, доступные для чтения.

  • end — это событие запускается, когда больше нет данных для чтения.
  • error — это событие запускается, когда возникает ошибка при получении или записи данных.
  • finish — это событие запускается когда все данные были сброшены в базовую систему.

Потоки с возможностью записи

Запись следующий код внутри файла server.js .

//server.jsconst fs = require ('fs') const data = 'Writable Stream Example'const  WriterStream = fs.createWriteStream ('write.txt') writerStream.write (data, 'UTF8') writerStream.end () writerStream.on ('finish', function () {console.log ('Запись завершена');}  ) writerStream.on ('error', function (err) {console.log (err.stack)}) console.log ('Streaming Ended') 

При запуске сервера, если файл отсутствует, он создаст его и запишет данные внутри него, а затем, когда запись закончится, мы сможем увидеть вывод внутри терминала, а также внутри ne wly созданный файл.

Конвейер потоков

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

//server.jsconst fs = require ('fs') const readerStream = fs.createReadStream  ('data.txt') const writerStream = fs.createWriteStream ('data2.txt') readerStream.pipe (writerStream) console.log ('Трубопровод завершен') 

Итак, мы чтение данных из файла data.txt и запись данных в другой файл с именем data2.txt.

Мы направили readerStream в writerStream.

Разница между fs.readFile () и fs.createReadStream ()

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

Наконец, урок по Node Streams с примером закончен.

Оцените статью
nanomode.ru
Добавить комментарий