Node.js'deki akışlar karmaşık olabilir ancak bunları anlamak için zaman ayırmaya değer.
Temel Çıkarımlar
- Node.js'deki akışlar, veri işleme ve aktarım için temel bir araçtır ve bu da onları gerçek zamanlı ve olay odaklı uygulamalar için ideal kılar.
- Node.js'de yazılabilir bir akış oluşturmak için fs modülünün verileri belirli bir konuma yazan createWriteStream() işlevini kullanabilirsiniz.
- Okunabilir, yazılabilir, çift yönlü ve dönüştürme, Node.js'deki dört akış türüdür ve her birinin kendi kullanım durumu ve işlevi vardır.
Akış, veri akışıyla ilgilenen temel bir programlama aracıdır. Özünde, bir akış tipik olarak baytların bir noktadan diğerine sıralı aktarımını temsil eder. Node.js'nin resmi belgeleri, akışı verilerle çalışmak için kullanabileceğiniz soyut bir arayüz olarak tanımlar.
Verilerin bir bilgisayara veya ağ üzerinden aktarılması, akışın ideal bir kullanımıdır.
Node.js'deki akışlar
Akışlar, Node.js'nin başarısında önemli bir rol oynadı. Node.js çalışma zamanı ortamının iki öne çıkan özelliği olan gerçek zamanlı veri işleme ve olaya dayalı uygulamalar için idealdirler.
Node.js'de yeni bir akış oluşturmak için yalnızca Strings ve Strings ile çalışan akış API'sini kullanmanız gerekir. Node.js arabellek verileri. Node.js'de dört tür akış vardır: yazılabilir, okunabilir, çift yönlü ve dönüştürülebilir.
Yazılabilir Akış Nasıl Oluşturulur ve Kullanılır
Yazılabilir bir akış, verileri belirli bir konuma yazmanıza veya göndermenize olanak tanır. fs (dosya sistemi) modülü, yeni bir akış oluşturmak için kullanabileceğiniz bir WriteStream sınıfına sahiptir. fs.createWriteStream() işlev. Bu işlev, isteğe bağlı seçenekler dizisinin yanı sıra, veri yazmak istediğiniz dosyanın yolunu da kabul eder.
const {createWriteStream} = require("fs");(() => {
const file = "myFile.txt";
const myWriteStream = createWriteStream(file);
let x = 0;
const writeNumber = 10000;
const writeData = () => {
while (x < writeNumber) {
const chunk = Buffer.from(`${x}, `, "utf-8");
if (x writeNumber - 1) return myWriteStream.end(chunk);
if (!myWriteStream.write(chunk)) break;
x++
}
};
writeData();
})();
Bu kod şunları içe aktarır: createWriteStream() hangi fonksiyon anonim ok işlevi daha sonra verileri myFile.txt dosyasına yazan bir akış oluşturmak için kullanır. Anonim işlev, adı verilen bir iç işlev içerir. veriyaz() bu veri yazıyor.
createWriteStream() işlevi, hedef dosyaya bir sayı koleksiyonu (0-9.999) yazmak için bir arabellekle çalışır. Ancak yukarıdaki betiği çalıştırdığınızda aynı dizinde aşağıdaki verileri içeren bir dosya oluşturulur:
Mevcut sayı koleksiyonu 2.915'te bitiyor, ancak 9.999'a kadar sayıları içermesi gerekirdi. Bu tutarsızlık, her WriteStream'in aynı anda sabit miktarda veri depolayan bir arabellek kullanması nedeniyle oluşur. Bu varsayılan değerin ne olduğunu öğrenmek için yüksekSuMark seçenek.
console.log("The highWaterMark value is: " +
myWriteStream.writableHighWaterMark + " bytes.");
Yukarıdaki kod satırını anonim fonksiyona eklemek, terminalde aşağıdaki çıktıyı üretecektir:
Terminal çıkışı, varsayılanın yüksekSuMark değer (özelleştirilebilir) 16.384 bayttır. Bu, bu arabellekte aynı anda yalnızca 16.384 baytın altında veri depolayabileceğiniz anlamına gelir. Yani, 2.915'e kadar olan sayı (artı tüm virgüller ve boşluklar), arabelleğin bir defada depolayabileceği maksimum veri miktarını temsil eder.
Tampon hatasının çözümü bir akış olayı kullanmaktır. Bir akış, veri aktarım sürecinin farklı aşamalarında çeşitli olaylarla karşılaşır. boşaltmak event bu duruma uygun seçenektir.
İçinde veriyaz() yukarıdaki fonksiyona yapılan çağrı WriteStream'in write() işlevi Veri yığını (veya dahili arabellek) belirtilen değerin altındaysa işlev true değerini döndürür. yüksekSuMark değer. Bu, uygulamanın akışa daha fazla veri gönderebileceğini gösterir. Ancak, en kısa sürede yazmak() işlevi false değerini döndürür, arabelleği boşaltmanız gerektiğinden döngü bozulur.
myWriteStream.on('drain', () => {
console.log("a drain has occurred...");
writeData();
});
Ekleme boşaltmak yukarıdaki olay kodunu anonim işleve boşaltacak WriteStream'in arabelleği kapasiteye ulaştığında. Daha sonra şunu hatırlatır: veriyaz() Böylece veri yazmaya devam edebilir. Güncellenen uygulamayı çalıştırmak aşağıdaki çıktıyı üretecektir:
Uygulamanın boşaltması gerektiğini unutmayın. WriteStream arabelleği infazı sırasında üç kez. Metin dosyasında da bazı değişiklikler yaşandı:
Okunabilir Bir Akış Nasıl Oluşturulur ve Kullanılır
Verileri okumak için okunabilir bir akış oluşturarak başlayın. fs.createReadStream() işlev.
const {createReadStream} = require("fs");
(() => {
const file = "myFile.txt";
const myReadStream = createReadStream(file);myReadStream.on("open", () => {
console.log(`The read stream has successfully opened ${file}.`);
});myReadStream.on("data", chunk => {
console.log("The file contains the following data: " + chunk.toString());
});
myReadStream.on("close", () => {
console.log("The file has been successfully closed.");
});
})();
Yukarıdaki komut dosyası şunu kullanır: createReadStream() Önceki kodun oluşturduğu dosyaya erişme yöntemi: myFile.txt. createReadStream() işlev bir dosya yolunu (dize, arabellek veya URL biçiminde olabilir) ve çeşitli isteğe bağlı seçenekleri bağımsız değişken olarak kabul eder.
Anonim işlevde birkaç önemli akış olayı vardır. Ancak buna dair hiçbir işaret yok boşaltmak etkinlik. Bunun nedeni, okunabilir bir akışın yalnızca veriyi ara belleğe almasıdır. Stream.Push (yığın) işlevini kullanın veya kullanın okunabilir etkinlik.
açık fs, okumak istediğiniz dosyayı açtığında olay tetiklenir. Eklediğinizde veri olayı dolaylı olarak sürekli bir akışa dönüştürür, akışın akış moduna geçmesine neden olur. Bu, verilerin kullanılabilir hale gelir gelmez geçmesine olanak tanır. Yukarıdaki uygulamayı çalıştırmak aşağıdaki çıktıyı üretir:
Çift Yönlü Akış Nasıl Oluşturulur ve Kullanılır
Çift yönlü bir akış, hem yazılabilir hem de okunabilir akış arayüzlerini uygular; böylece böyle bir akışı okuyabilir ve yazabilirsiniz. Bunun bir örneği, oluşturulması için net modülüne dayanan bir TCP soketidir.
Çift yönlü akışın özelliklerini göstermenin basit bir yolu, verileri aktaran bir TCP sunucusu ve istemcisi oluşturmaktır.
Server.js Dosyası
const net = require('net');
const port = 5000;
const host = '127.0.0.1';const server = net.createServer();
server.on('connection', (socket)=> {
console.log('Connection established from client.');socket.on('data', (data) => {
console.log(data.toString());
});socket.write("Hi client, I am server " + server.address().address);
socket.on('close', ()=> {
console.log('the socket is closed')
});
});
server.listen(port, host, () => {
console.log('TCP server is running on port: ' + port);
});
Client.js Dosyası
const net = require('net');
const client = new net.Socket();
const port = 5000;
const host = '127.0.0.1';client.connect(port, host, ()=> {
console.log("connected to server!");
client.write("Hi, I'm client " + client.address().address);
});client.on('data', (data) => {
console.log(data.toString());
client.write("Goodbye");
client.end();
});
client.on('end', () => {
console.log('disconnected from server.');
});
Hem sunucu hem de istemci komut dosyalarının iletişim kurmak (veri aktarmak ve almak) için okunabilir ve yazılabilir bir akış kullandığını fark edeceksiniz. Doğal olarak önce sunucu uygulaması çalışır ve bağlantıları dinlemeye başlar. İstemciyi başlattığınızda, sunucuya şunu kullanarak bağlanır: TCP bağlantı noktası numarası.
Bağlantı kurulduktan sonra istemci, sunucuya yazarak veri aktarımını başlatır. Yazma Akışı. Sunucu aldığı verileri terminale kaydeder ve ardından WriteStream'i kullanarak verileri yazar. Son olarak istemci aldığı verileri günlüğe kaydeder, ek verileri yazar ve ardından sunucuyla bağlantısını keser. Sunucu diğer istemcilerin bağlanmasına açık kalır.
Dönüşüm Akışı Nasıl Oluşturulur ve Kullanılır
Dönüşüm akışları, çıkışın girişle ilişkili olduğu ancak girişten farklı olduğu çift yönlü akışlardır. Node.js'de iki tür Dönüşüm akışı vardır: zlib ve kripto akışları. Bir zlib akışı, bir metin dosyasını sıkıştırabilir ve ardından dosya aktarımından sonra sıkıştırılmış dosyayı açabilir.
CompressFile.js Uygulaması
const zlib = require('zlib');
const { createReadStream, createWriteStream } = require('fs');(() => {
const source = createReadStream('myFile.txt');
const destination = createWriteStream('myFile.txt.gz');
source.pipe(zlib.createGzip()).pipe(destination);
})();
Bu basit komut dosyası orijinal metin dosyasını alır, sıkıştırır ve geçerli dizinde saklar. Okunabilir akışın özellikleri sayesinde bu basit bir işlemdir. boru() yöntem. Akış boru hatları, arabellek kullanımını ortadan kaldırır ve verileri doğrudan bir akıştan diğerine aktarır.
Ancak veriler koddaki yazılabilir akışa ulaşmadan önce zlib'in createGzip() yöntemi aracılığıyla biraz dolambaçlı yoldan geçer. Bu yöntem dosyayı sıkıştırır ve yazma akışının aldığı yeni bir Gzip nesnesini döndürür.
decompressFile.js Uygulaması
const zlib = require('zlib');
const { createReadStream, createWriteStream } = require('fs');
(() => {
const source = createReadStream('myFile.txt.gz');
const destination = createWriteStream('myFile2.txt');
source.pipe(zlib.createUnzip()).pipe(destination);
})();
Yukarıdaki bu komut dosyası sıkıştırılmış dosyayı alır ve sıkıştırmasını açar. Yenisini açarsan dosyam2.txt dosyasının orijinal dosyayla aynı verileri içerdiğini göreceksiniz:
Akışlar Neden Önemlidir?
Akışlar veri aktarımının verimliliğini artırır. Okunabilir ve yazılabilir akışlar, istemciler ve sunucular arasındaki iletişimin yanı sıra büyük dosyaların sıkıştırılması ve aktarılmasına da olanak sağlayan temel görevi görür.
Akışlar ayrıca programlama dillerinin performansını da artırır. Akışlar olmadan, veri aktarım süreci daha karmaşık hale gelir, geliştiricilerin daha fazla manuel giriş yapmasını gerektirir ve daha fazla hata ve performans sorununa neden olur.