В этом уроке вы узнаете
Файловый поток в Node.js
Узел широко использует потоки в качестве механизма передачи данных.
Например, когда вы выводите что-либо на консоль с помощью функции 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); });
Объяснение кода: —
- Сначала нам нужно включить модули ‘fs’, которые содержат все функции, необходимые для создания потоков.
- Далее мы создаем читаемый поток с помощью метода — createReadStream. В качестве входных данных мы даем расположение нашего файла data.txt.
- Функция steam.on является обработчиком событий, и в нем мы указываем первый параметр как «данные». Это означает, что всякий раз, когда данные поступают в поток из файла, затем выполняют функцию обратного вызова. В нашем случае мы определяем функцию обратного вызова, которая будет выполнять 2 основных шага. Первый — преобразовать данные, прочитанные из файла, в строку. Вторым будет отправка преобразованной строки в качестве вывода на консоль.
- Мы берем каждый кусок данных, который считывается из потока данных, и преобразуем его в строку.
- Наконец, мы отправляем вывод каждой преобразованной строки в консоль.
Вывод:
- Если код выполнен правильно, вы увидите вышеприведенный вывод в консоли. Этот вывод будет таким же, как в файле 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")
Объяснение кода: —
- Мы создаем поток с возможностью записи с помощью метода — createWriteStream. В качестве входных данных мы даем расположение нашего файла data.txt.
- Затем мы использовали метод 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);
Объяснение кода: —
- Сначала мы создаем «readstream» для нашего файла datainput.txt, который содержит все наши данные, которые необходимо перенести в новый файл.
- Затем нам нужно создать «writestream» для нашего файла dataOutput.txt, который является нашим пустым файлом и местом назначения для передачи данных из файла datainput.txt.
- Затем мы используем команду 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');
Объяснение кода: —
- Используйте функцию require, чтобы включить модуль ‘events’. С помощью этого модуля вы сможете создавать события в Node.js.
- Создать новый источник событий. Это используется для привязки события, которое в нашем случае «data_received», к функции обратного вызова, определенной в шаге 3.
- Мы определяем управляемую событиями функцию, которая говорит, что если в случае срабатывания события «data_received» мы должны вывести текст «data_received» на консоль.
- Наконец, у нас есть ручной запуск нашего события с использованием функции eventEmiter.emit. Это вызовет событие data_received.
При запуске программы текст «полученные данные» будет отправлен на консоль, как показано ниже.
Излучение событий
При определении событий существуют разные методы для событий, которые можно вызывать. Эта тема посвящена подробному рассмотрению каждого из них.
- Одноразовые обработчики событий
Иногда вам может быть интересно реагировать на событие только в первый раз. В этих ситуациях вы можете использовать метод Once ().
Давайте посмотрим, как мы можем использовать метод Once для обработчиков событий.
Объяснение кода: —
- Здесь мы используем метод «Once», чтобы сказать, что для события «data_received» функция обратного вызова должна выполняться только один раз.
- Здесь мы вручную запускаем событие data_received.
- Когда событие data_received снова запускается, на этот раз ничего не произойдет. Это из-за первого шага, когда мы сказали, что событие может быть инициировано только один раз.
Если код выполняется правильно, вывод в журнале будет «data_received успешно». Это сообщение появится в консоли только один раз.
- Проверка прослушивателей событий
В любой момент своей жизни к источнику событий может быть подключено ноль или более слушателей. Слушатели для каждого типа события могут быть проверены несколькими способами.
Если вас интересует только определение количества подключенных слушателей, тогда не ищите ничего, кроме метода EventEmitter.listenerCount ().
( Примечание: слушатели важны, потому что основная программа должна знать, добавляются ли слушатели на лету к событию, иначе программа будет работать неправильно, потому что будут вызваны дополнительные слушатели.)
Объяснение кода: —
- Мы определяем тип eventEmitter, который требуется для использования методов, связанных с событиями.
- Затем мы определяем объект с именем emitter, который будет использоваться для определения наших обработчиков событий.
- Мы создаем 2 обработчика событий, которые в основном ничего не делают. Это просто для нашего примера, чтобы показать, как работает метод listenerCount.
- Теперь, когда вы вызываете метод listenerCount для нашего события data_received, он отправляет число прослушивателей событий, связанных с этим событием, в журнале консоли.
Если код выполняется правильно, значение 2 будет показано в журнале консоли.
- Событие 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() {});
Объяснение кода: —
- Мы создаем новый обработчик событий для события ‘newListener’. Поэтому всякий раз, когда регистрируется новый обработчик событий, в консоли будет отображаться текст «Добавлен прослушиватель для» + имя события.
- Здесь мы пишем в консоль текст «Добавлен прослушиватель для» + имя события для каждого зарегистрированного события.
- Мы определяем 2 обработчика событий для нашего события data_received.
Если приведенный выше код выполнен правильно, приведенный ниже текст будет отображаться в консоли. Это просто показывает, что обработчик события ‘newListener’ был запущен дважды.
Добавлен слушатель событий data_received
Добавлен слушатель событий data_received
Резюме
- Потоки используются в Node.js для чтения и записи данных с устройств ввода-вывода. Node.js использует библиотеку ‘fs’ для создания читаемых и записываемых потоков в файлы. Эти потоки могут использоваться для чтения и записи данных из файлов.
- Трубы могут быть использованы для соединения нескольких потоков вместе. Один из наиболее распространенных примеров — это объединение потоков чтения и записи для передачи данных из одного файла в другой.
- Node.js часто также помечается как управляемая событиями среда, и очень легко определять события в Node.js. Можно определить функции, которые отвечают на эти события.
- События также предоставляют методы реагирования на ключевые события. Например, мы видели обработчик события Once (), который можно использовать, чтобы убедиться, что функция обратного вызова выполняется только один раз, когда событие инициируется.