Урок за Node js Streams: Filestream, Pipes
Файлов поток в 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); });
Обяснение на кода:-
- Първо трябва да включим модулите '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
Въведение
Събития
Generators
Свързване на данни
Използването на жасмин
Тръби в Node.js
В рамките на приложенията на Node, потоците могат да се подават заедно с помощта на метода pipe(), който приема два аргумента:
- Задължителен поток с възможност за запис, който действа като дестинация за данните и
- Незадължителен обект, използван за предаване на опции.
Типичен пример за използване на канали, ако искате да прехвърлите данни от един файл в друг.
Така че нека видим пример за това как можем да прехвърляме данни от един файл в друг с помощта на канали.
Стъпка 1) Създайте файл с име datainput.txt, който съдържа данните по-долу. Да предположим, че този файл се съхранява на D устройството на нашата локална машина.
Урок за Node.js
Въведение
Събития
Generators
Свързване на данни
Използване на жасмин
Стъпка 2) Създайте празен празен файл, наречен dataOutput.txt, и го поставете на D устройството на вашата локална машина.
Стъпка 3) Напишете кода по-долу, за да извършите прехвърлянето на данни от файла dataOutput.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, който е нашият празен файл и е дестинацията за прехвърляне на данни от файла dataOutput.txt.
- След това използваме командата pipe, за да прехвърлим данните от потока за четене към потока за запис. Командата pipe ще вземе всички данни, които идват в потока за четене, и ще ги избута към потока за запис.
Ако сега отворите файла dataOutput.txt, ще видите всички данни, които присъстват във файла dataOutput.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');
Обяснение на кода:-
- Използвайте функцията за изискване, за да включите модула „събития“. С този модул ще можете да създавате събития в 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 събития
Oбобщение
- Потоците се използват в Node.js за четене и запис на данни от входно-изходни устройства. Node.js използва библиотеката 'fs' за създаване на четими и записваеми потоци към файлове. Тези потоци могат да се използват за четене и запис на данни от файлове.
- Тръбите могат да се използват за свързване на множество потоци заедно. Един от най-често срещаните примери е предаването на потока за четене и запис заедно за прехвърляне на данни от един файл в друг.
- Node.js често също се маркира като рамка, управлявана от събития, и е много лесно да се дефинират събития в Node.js. Могат да се дефинират функции, които отговарят на тези събития.
- Събитията също разкриват методи за реагиране на ключови събития. Например, видяхме манипулатора на събития once(), който може да се използва, за да се увери, че функцията за обратно извикване се изпълнява само веднъж, когато се задейства събитие.