Node.js Akışları Eğitimi: Dosya Akışı, Borular
Node.js'de dosya akışı
Node, veri aktarım mekanizması olarak akışlardan kapsamlı bir şekilde yararlanır.
Örneğin, console.log işlevini kullanarak konsola herhangi bir şeyin çıktısını aldığınızda, aslında verileri konsola göndermek için bir akış kullanıyorsunuz demektir.
Node.js ayrıca dosyalardan veri akışını sağlayarak dosyaların uygun şekilde okunup yazılabilmesini sağlar. Şimdi dosyalardan okumak ve yazmak için akışları nasıl kullanabileceğimize dair bir örneğe bakacağız. Bu örnek için aşağıda belirtilen adımları izlememiz gerekiyor.
) 1 Adım Aşağıdaki verileri içeren data.txt adında bir dosya oluşturun. Bu dosyanın yerel makinemizin D sürücüsünde saklandığını varsayalım.
Node.js ile ilgili eğitim
Giriş
Etkinlikler
Veri Bağlantısı
Yasemin Kullanımı
) 2 Adım Dosyadan veri okumak için akışlardan yararlanacak ilgili kodu yazın.
var fs = require("fs"); var stream; stream = fs.createReadStream("D://data.txt"); stream.on("data", function(data) { var chunk = data.toString(); console.log(chunk); });
Kod Açıklaması:-
- Öncelikle akış oluşturmak için gereken tüm işlevleri içeren 'fs' modüllerini eklememiz gerekiyor.
- Daha sonra createReadStream yöntemini kullanarak okunabilir bir akış oluşturuyoruz. Giriş olarak data.txt dosyamızın konumunu veriyoruz.
- steam.on işlevi bir olay işleyicisidir ve içinde ilk parametreyi 'veri' olarak belirtiyoruz. Bu, dosyadan akışa veri geldiğinde bir geri çağırma işlevinin yürütüleceği anlamına gelir. Bizim durumumuzda 2 temel adımı gerçekleştirecek bir geri çağırma fonksiyonu tanımlıyoruz. Birincisi dosyadan okunan veriyi string olarak dönüştürmektir. İkincisi, dönüştürülen dizeyi çıktı olarak konsola göndermek olacaktır.
- Veri akışından okunan her veri yığınını alıp bir dizeye dönüştürüyoruz.
- Son olarak, dizeye dönüştürülen her öbeğin çıktısını konsola gönderiyoruz.
Çıktı:
- Eğer kod düzgün bir şekilde çalıştırılırsa konsolda yukarıdaki çıktıyı göreceksiniz. Bu çıktı data.txt dosyasındaki çıktıyla aynı olacaktır.
Bir dosyaya yazma
Aynı şekilde bir okuma akışı oluşturduğumuz gibi, bir dosyaya veri yazmak için bir yazma akışı da oluşturabiliriz. Öncelikle data.txt adında içeriği olmayan boş bir dosya oluşturalım. Bu dosyanın bilgisayarımızın D sürücüsüne yerleştirildiğini varsayalım.
Aşağıdaki kod dosyaya nasıl veri yazabileceğimizi göstermektedir.
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")
Kod Açıklaması:-
- CreateWriteStream yöntemini kullanarak yazılabilir bir akış oluşturuyoruz. Giriş olarak data.txt dosyamızın konumunu veriyoruz.
- Daha sonra, metnin farklı satırlarını metin dosyamıza yazmak için Stream.write yöntemini kullandık. Akış, bu verilerin data.txt dosyasına yazılmasıyla ilgilenecektir.
data.txt dosyasını açarsanız, dosyada artık aşağıdaki verileri göreceksiniz
Node.js ile ilgili eğitim
Giriş
Etkinlikler
Generators
Veri Bağlantısı
kullanma Yasemin
Node.js'deki borular
Node uygulamalarında akışlar, iki argüman alan pipe() yöntemi kullanılarak bir araya getirilebilir:
- Veriler için hedef görevi gören gerekli bir yazılabilir akış ve
- Seçenekleri iletmek için kullanılan isteğe bağlı bir nesne.
Verileri bir dosyadan diğerine aktarmak istiyorsanız boruları kullanmanın tipik bir örneği.
Şimdi boruları kullanarak verileri bir dosyadan diğerine nasıl aktarabileceğimize dair bir örnek görelim.
) 1 Adım Aşağıdaki verileri içeren datainput.txt adında bir dosya oluşturun. Bu dosyanın yerel makinemizin D sürücüsünde saklandığını varsayalım.
Node.js ile ilgili eğitim
Giriş
Etkinlikler
Generators
Veri Bağlantısı
Yasemin Kullanımı
) 2 Adım dataOutput.txt adında boş bir dosya oluşturun ve bunu yerel makinenizin D sürücüsüne yerleştirin.
) 3 Adım Datainput.txt dosyasındaki verilerin dataOutput.txt dosyasına aktarımını gerçekleştirmek için aşağıdaki kodu yazın.
var fs = require("fs"); var readStream = fs.createReadStream("D://datainput.txt"); var writeStream = fs.createWriteStream("D://dataOutput.txt"); readStream.pipe(writeStream);
Kod Açıklaması:-
- Yeni dosyaya aktarılması gereken tüm verilerimizi içeren datainput.txt dosyamıza öncelikle bir “readstream” oluşturuyoruz.
- Daha sonra boş dosyamız olan ve datainput.txt dosyasından veri aktarımının hedefi olan dataOutput.txt dosyamıza bir “writestream” oluşturmamız gerekiyor.
- Daha sonra verileri okuma akışından yazma akışına aktarmak için pipe komutunu kullanırız. Pipe komutu, okuma akışına gelen tüm verileri alacak ve onu yazma akışına gönderecektir.
Şimdi dataOutput.txt dosyasını açarsanız datainput.txt dosyasında bulunan tüm verileri göreceksiniz.
Node.js'deki etkinlikler
Etkinlikler, Node.js'deki temel kavramlardan biridir ve bazen Node.js, Olay odaklı çerçeve olarak anılır.
Temel olarak bir olay meydana gelen bir şeydir. Örneğin bir veritabanına bağlantı kurulduğunda veritabanı bağlantı olayı tetiklenir. Olay odaklı programlama, belirli olaylar tetiklendiğinde tetiklenecek işlevler oluşturmaktır.
Node.js'de bir etkinliği tanımlamanın temel bir örneğine bakalım.
'data_received' adında bir etkinlik oluşturacağız. Bu olay tetiklendiğinde konsola “veri alındı” metni gönderilecektir.
var events = require('events'); var eventEmitter = new events.EventEmitter(); eventEmitter.on('data_received', function() { console.log('data received succesfully.'); }); eventEmitter.emit('data_received');
Kod Açıklaması:-
- 'Olaylar' modülünü eklemek için require işlevini kullanın. Bu modül ile Node.js'de etkinlikler oluşturabileceksiniz.
- Yeni bir olay yayıcı oluşturun. Bu, bizim durumumuzda "data_received" olan olayı, 3. adımda tanımlanan bir geri çağırma işlevine bağlamak için kullanılır.
- "data_received" olayının tetiklenmesi durumunda konsola "data_received" metnini çıkarmamız gerektiğini söyleyen olay odaklı bir fonksiyon tanımlıyoruz.
- Son olarak, eventEmiter.emit işlevini kullanarak etkinliğimizi manuel olarak tetikleyebiliriz. Bu data_received olayını tetikleyecektir.
Program çalıştırıldığında konsola aşağıda gösterildiği gibi “veri alındı” yazısı gönderilecektir.
Olay Yayan
Olayları tanımlarken, olaylar için çağrılabilecek farklı yöntemler vardır. Bu konu her birine ayrıntılı olarak bakmaya odaklanıyor.
- Tek seferlik olay işleyicileri
Bazen bir olaya yalnızca ilk meydana geldiği anda tepki vermek ilginizi çekebilir. Bu durumlarda once() yöntemini kullanabilirsiniz.
Olay işleyicileri için once yöntemini nasıl kullanabileceğimizi görelim.
Kod Açıklaması:-
- Burada 'data_received' olayı için geri çağırma fonksiyonunun yalnızca bir kez yürütülmesi gerektiğini söylemek için 'once' yöntemini kullanıyoruz.
- Burada 'data_received' olayını manuel olarak tetikliyoruz.
- 'data_received' olayı tekrar tetiklendiğinde bu sefer hiçbir şey olmayacak. Bunun nedeni, olayın yalnızca bir kez tetiklenebileceğini söylediğimiz ilk adımdır.
Kod düzgün bir şekilde yürütülürse, günlükteki çıktı 'data_received başarıyla' olacaktır. Bu mesaj konsolda yalnızca bir kez görünecektir.
- Olay Dinleyicilerini İnceleme
Bir olay yayıcıya ömrünün herhangi bir noktasında sıfır veya daha fazla dinleyici eklenebilir. Her olay türü için dinleyiciler çeşitli şekillerde incelenebilir.
Yalnızca eklenen dinleyicilerin sayısını belirlemekle ilgileniyorsanız, EventEmitter.listenerCount() yönteminden başka bir yere bakmayın.
(Not: Dinleyiciler önemlidir çünkü ana programın, dinleyicilerin bir etkinliğe anında eklenip eklenmediğini bilmesi gerekir, aksi takdirde ek dinleyiciler çağrılacağından program arızalanır.)
Kod Açıklaması:-
- Event ile ilgili metodların kullanılabilmesi için gerekli olan eventEmitter tipini tanımlıyoruz.
- Daha sonra olay işleyicilerimizi tanımlamak için kullanılacak yayıcı adı verilen bir nesneyi tanımlıyoruz.
- Temelde hiçbir şey yapmayan 2 olay işleyicisi yaratıyoruz. Bu, listenerCount yönteminin nasıl çalıştığını göstermek için örneğimizde basit tutuldu.
- Artık data_received olayımızda listenerCount yöntemini çağırdığınızda, bu olaya eklenen olay dinleyicilerinin sayısını konsol günlüğüne gönderecektir.
Kod düzgün bir şekilde yürütülürse konsol günlüğünde 2 değeri gösterilecektir.
- NewListener Etkinliği
Her yeni olay işleyicisi kaydedildiğinde, olay yayıcı bir newListener olayı yayar. Bu olay, yeni olay işleyicilerini tespit etmek için kullanılır. Her yeni olay işleyicisi için kaynakları ayırmanız veya bazı eylemler gerçekleştirmeniz gerektiğinde genellikle newListener olayını kullanırsınız.
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() {});
Kod Açıklaması:-
- 'newListener' olayı için yeni bir olay işleyicisi oluşturuyoruz. Dolayısıyla, yeni bir olay işleyicisi kaydedildiğinde konsolda "Dinleyici eklendi" metni + etkinlik adı görüntülenecektir.
- Burada konsola kayıtlı her etkinlik için “Dinleyici eklendi” metnini + etkinlik adını yazıyoruz.
- 'data_received' olayımız için 2 olay işleyicisi tanımlıyoruz.
Yukarıdaki kod düzgün bir şekilde yürütülürse, aşağıdaki metin konsolda gösterilecektir. Sadece 'newListener' olay işleyicisinin iki kez tetiklendiğini gösteriyor.
data_received etkinlikleri için dinleyici eklendi
data_received etkinlikleri için dinleyici eklendi
ÖZET
- Node.js'de Giriş-Çıkış cihazlarından veri okumak ve yazmak için akışlar kullanılır. node.js Dosyalara okunabilir ve yazılabilir akışlar oluşturmak için 'fs' kitaplığını kullanır. Bu akışlar dosyalardan veri okumak ve yazmak için kullanılabilir.
- Borular birden fazla akışı birbirine bağlamak için kullanılabilir. En yaygın örneklerden biri, verilerin bir dosyadan diğerine aktarılması için okuma ve yazma akışının bir araya getirilmesidir.
- Node.js genellikle olay odaklı bir çerçeve olarak da etiketlenir ve Node.js'de olayları tanımlamak çok kolaydır. Bu olaylara yanıt veren işlevler tanımlanabilir.
- Olaylar ayrıca önemli olaylara yanıt verme yöntemlerini de ortaya çıkarır. Örneğin, bir geri çağırma fonksiyonunun bir olay tetiklendiğinde yalnızca bir kez yürütüldüğünden emin olmak için kullanılabilecek once() olay işleyicisini gördük.