Учебное пособие по Node js Streams: Filestream, Pipes

Содержание:

Anonim

В этом руководстве вы узнаете

  • Файловый поток в Node.js
  • Трубы в Node.js
  • События в Node.js
  • Испускание событий

Файловый поток в Node.js

Node широко использует потоки в качестве механизма передачи данных.

Например, когда вы выводите что-либо на консоль с помощью функции console.log, вы фактически используете поток для отправки данных на консоль.

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

Шаг 1) Создайте файл с именем data.txt, содержащий указанные ниже данные. Предположим, этот файл хранится на диске D нашей локальной машины.

Учебник по Node.js

Вступление

События

Генераторы

Подключение к данным

Использование жасмина

Шаг 2) Напишите соответствующий код, который будет использовать потоки для чтения данных из файла.

var fs = require("fs");var stream;stream = fs.createReadStream("D://data.txt");stream.on("data", function(data) {var chunk = data.toString();console.log(chunk);});

Пояснение к коду: -

  1. Сначала нам нужно включить модули fs, которые содержат все функции, необходимые для создания потоков.
  2. Затем мы создаем читаемый поток с помощью метода createReadStream. В качестве входных данных мы указываем расположение нашего файла data.txt.
  3. Функция steam.on является обработчиком событий, и в ней мы указываем первый параметр как «данные». Это означает, что всякий раз, когда данные поступают в поток из файла, выполняется функция обратного вызова. В нашем случае мы определяем функцию обратного вызова, которая будет выполнять 2 основных шага. Первый - преобразовать данные, считанные из файла, в строку. Второй - отправить преобразованную строку в качестве вывода на консоль.
  4. Мы берем каждый фрагмент данных, который считывается из потока данных, и конвертируем его в строку.
  5. Наконец, мы отправляем на консоль вывод каждого блока, преобразованного в строку.

Выход:

  • Если код выполнен правильно, вы увидите вывод в консоли. Этот вывод будет таким же, как и в файле data.txt.

Запись в файл

Точно так же, как мы создаем поток чтения, мы также можем создать поток записи для записи данных в файл. Давайте сначала создадим пустой файл без содержимого с именем data.txt. Предположим, этот файл находится на диске D нашего компьютера.

В приведенном ниже коде показано, как мы можем записывать данные в файл.

var fs = require("fs");var stream;stream = fs.createWriteStream("D://data.txt");stream.write("Tutorial on Node.js")stream.write("Introduction")stream.write("Events")stream.write("Generators")stream.write("Data Connectivity")stream.write("Using Jasmine")

Пояснение к коду: -

  1. Мы создаем доступный для записи поток с помощью метода createWriteStream. В качестве входных данных мы указываем расположение нашего файла data.txt.
  2. Затем мы использовали метод stream.write для записи различных строк текста в наш текстовый файл. Поток позаботится о записи этих данных в файл data.txt.

Если вы откроете файл data.txt, вы увидите следующие данные в файле

Учебник по Node.js

Вступление

События

Генераторы

Подключение к данным

Использование жасмина

Трубы в Node.js

В приложениях Node потоки могут быть объединены по конвейеру с помощью метода pipe (), который принимает два аргумента:

  • Обязательный доступный для записи поток, который действует как место назначения для данных и
  • Необязательный объект, используемый для передачи параметров.

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

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

Шаг 1) Создайте файл с именем datainput.txt, содержащий указанные ниже данные. Предположим, этот файл хранится на диске D нашей локальной машины.

Учебник по Node.js

Вступление

События

Генераторы

Подключение к данным

Использование жасмина

Шаг 2) Создайте пустой пустой файл с именем dataOutput.txt и поместите его на диск D вашего локального компьютера.

Шаг 3) Напишите приведенный ниже код для выполнения передачи данных из файла datainput.txt в файл dataOutput.txt.

var fs = require("fs");var readStream = fs.createReadStream("D://datainput.txt");var writeStream = fs.createWriteStream("D://dataOutput.txt");readStream.pipe(writeStream);

Пояснение к коду: -

  1. Сначала мы создаем «поток чтения» для нашего файла datainput.txt, который содержит все наши данные, которые необходимо перенести в новый файл.
  2. Затем нам нужно создать «поток записи» в наш файл dataOutput.txt, который является нашим пустым файлом и является местом назначения для передачи данных из файла datainput.txt.
  3. Затем мы используем команду pipe для передачи данных из потока чтения в поток записи. Команда pipe возьмет все данные, поступающие в поток чтения, и отправит их в поток записи.

Если вы сейчас откроете файл dataOutput.txt, вы увидите все данные, которые были в файле datainput.txt.

События в Node.js

События являются одним из ключевых понятий в Node.js, и иногда Node.js называют фреймворком, управляемым событиями.

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

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

Мы собираемся создать событие под названием data_received. Когда это событие запускается, на консоль будет отправлен текст «данные получены».

var events = require('events');var eventEmitter = new events.EventEmitter();eventEmitter.on('data_received', function() {console.log('data received succesfully.');});eventEmitter.emit('data_received');

Пояснение к коду: -

  1. Используйте функцию require, чтобы включить модуль «события». С помощью этого модуля вы сможете создавать события в Node.js.
  2. Создайте новый эмиттер событий. Это используется для привязки события, которым в нашем случае является data_received, к функции обратного вызова, которая определена на шаге 3.
  3. Мы определяем управляемую событиями функцию, которая говорит, что если в случае срабатывания события «data_received», мы должны вывести текст «data_received» на консоль.
  4. Наконец, у нас есть ручной триггер нашего события с помощью функции eventEmiter.emit. Это вызовет событие data_received.

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

Испускание событий

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

  1. Одноразовые обработчики событий

Иногда вам может быть интересно отреагировать на событие только в первый раз, когда оно произойдет. В этих ситуациях вы можете использовать метод once ().

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

Пояснение к коду: -

  1. Здесь мы используем метод «once», чтобы сказать, что для события «data_received» функция обратного вызова должна выполняться только один раз.
  2. Здесь мы вручную запускаем событие data_received.
  3. Когда событие data_received запускается снова, на этот раз ничего не произойдет. Это связано с тем, что на первом этапе мы сказали, что событие может быть инициировано только один раз.

Если код выполнен правильно, вывод в журнале будет «data_received успешно». Это сообщение появится в консоли только один раз.

  1. Проверка слушателей событий

В любой момент своего существования эмиттер событий может иметь ноль или более прикрепленных к нему слушателей. Прослушиватели для каждого типа событий можно проверить несколькими способами.

Если вас интересует только определение количества подключенных слушателей, не ищите ничего, кроме метода EventEmitter.listenerCount ().

( Примечание: слушатели важны, потому что основная программа должна знать, добавляются ли слушатели к событию на лету, иначе программа будет работать неправильно, потому что будут вызваны дополнительные слушатели.)

Пояснение к коду: -

  1. Мы определяем тип eventEmitter, который требуется для использования методов, связанных с событиями.
  2. Затем мы определяем объект, называемый эмиттером, который будет использоваться для определения наших обработчиков событий.
  3. Мы создаем 2 обработчика событий, которые в основном ничего не делают. В нашем примере это просто, чтобы показать, как работает метод listenerCount.
  4. Теперь, когда вы вызываете метод listenerCount для нашего события data_received, он отправляет количество прослушивателей событий, прикрепленных к этому событию, в журнале консоли.

Если код выполнен правильно, в журнале консоли будет отображаться значение 2.

  1. Событие newListener

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

var events = require('events');var eventEmitter = events.EventEmitter;var emitter = new eventEmitter();emitter.on("newListener", function(eventName, listener) {console.log("Added listener for " + eventName + " events");});emitter.on('data_received', function() {});emitter.on('data_received', function() {});

Пояснение к коду: -

  1. Мы создаем новый обработчик событий для события newListener. Поэтому всякий раз, когда регистрируется новый обработчик событий, в консоли будет отображаться текст «Добавлен прослушиватель для» + имя события.
  2. Здесь мы пишем в консоль текст «Добавлен слушатель для» + имя события для каждого зарегистрированного события.
  3. Мы определяем 2 обработчика событий для нашего события data_received.

Если приведенный выше код выполнен правильно, в консоли отобразится приведенный ниже текст. Это просто показывает, что обработчик события newListener был запущен дважды.

Добавлен слушатель для событий data_received

Добавлен слушатель для событий data_received

Резюме

  • Потоки используются в Node.js для чтения и записи данных с устройств ввода-вывода. Node.js использует библиотеку fs для создания доступных для чтения и записи потоков в файлы. Эти потоки можно использовать для чтения и записи данных из файлов.
  • Каналы можно использовать для соединения нескольких потоков вместе. Один из наиболее распространенных примеров - объединение потоков чтения и записи по конвейеру для передачи данных из одного файла в другой.
  • Node.js также часто называют фреймворком, управляемым событиями, и очень легко определять события в Node.js. Можно определить функции, которые реагируют на эти события.
  • События также предоставляют методы реагирования на ключевые события. Например, мы видели обработчик события Once (), который можно использовать, чтобы убедиться, что функция обратного вызова выполняется только один раз при запуске события.