Node.js dosyasındaki “process.stdout.write” ve “console.log” arasındaki fark nedir?


323

Node.js dosyasındaki "process.stdout.write" ve "console.log" arasındaki fark nedir?

EDIT: bir değişken için console.log kullanmak process.stdout.write kullanırken okunamayan çok fazla karakter gösterdi bir nesne gösterdi.

Neden?


4
Bir örnek verebilir misiniz? console.log () biçimlendirilmiş çıktı ile process.stdout.write öğesini çağırır. Uygulama için console.js dosyasındaki format () öğesine bakın.
TK-421

Yanıtlar:


324

console.log()process.stdout.writebiçimlendirilmiş çıkışlı çağrılar . format()Uygulama için console.js dosyasına bakın .

Şu anda (v0.10.ish):

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};

34
Ayrıca console.log()yeni bir satır eklemek gibi görünüyor
jchook

144

Görünüşe göre Node belgelerine baktığımızda console.log sadece process.stdout.write ve sonunda satır sonu var:

console.log = function (d) {
  process.stdout.write(d + '\n');
};

Kaynak: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout


18
Daha sonra gelen insanlar için, v0.3.1'in uzun zaman önce olduğunu ve o zamandan beri işler değiştiğini lütfen unutmayın. :)
Brendan

5
...Hayır. Sadece v0.9.9 belgelerine baktım ve console.log hala bir linebreak ile işlemek için bir takma ad. Lütfen yorum yapmadan önce araştırmanızı yapın. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford

13
1) v0.9.9 iki yaşında 2) belgelerin yanlış olduğunu, v0.9.9 uyarınca biçimin util ile enterpolasyonu
Brendan

4
Aslında, belgelerin hiç güncellenmediği ve hala etrafta olduğu anlaşılıyor (kimse KURU?). Bunu düzeltmek için bir PR göndereceğim, bu konuyu bana bildirdiğiniz için teşekkürler :)
Brendan


66

Bunun çok eski bir soru olduğunu biliyorum ama kimsenin process.stdout.writeveconsole.log benim de bunu değinmek istiyorum.

As Mauvis Leford ve TK-421 işaret, console.logbir ekler line-break(satırın sonundaki karakteri \n) ama bu ne kadar değil.

Kod en azından 0.10.Xversiyondan bu yana değişmedi ve şimdi bir 5.Xversiyonumuz var.

İşte kod:

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};

Gördüğünüz gibi, söyleyen .apply(this, arguments)ve işlevsellik üzerinde büyük bir fark yaratan bir bölüm var . Bunu örneklerle açıklamak daha kolaydır:

process.stdout.write çok temel bir işlevselliğe sahiptir, orada bir şey yazabilirsiniz, şöyle:

process.stdout.write("Hello World\n"); 

Kesme çizgisini sonuna koymazsanız, dizenizden sonra tuhaf bir karakter alırsınız, şöyle bir şey:

process.stdout.write("Hello World"); //Hello World% 

(Bunun "programın sonu" gibi bir şey anlamına geldiğini düşünüyorum, bu yüzden yalnızca process.stdout.writedosyanızın sonunda kullanıldıysa ve mola satırını eklemediyseniz görürsünüz)

Öte yandan, console.logdaha fazlasını yapabilir.

  1. Aynı şekilde kullanabilirsiniz

    console.log("Hello World"); //You don't need the break line here because it was already formated ve ayrıca garip bir karakter kayboldu

  2. Birden fazla dize yazabilirsiniz

    console.log("Hello", "World");

  3. İlişkilendirmeler yapabilirsiniz

    console.log("Hello %s", "World") //Useful when "World" is inside a variable

İşte bu, ek işlevsellik util.format.applykısmı sayesinde verilir (bunun tam olarak ne yaptığı hakkında çok konuşabilirim ama benim fikrimi anlıyorsunuz, daha fazlasını buradan okuyabilirsiniz ).

Umarım birisi bu bilgiyi faydalı bulur.


Nasıl kullanılacağını stdout.writeve alınmasından kaçındığınızı da açıklamanız çok yararlı olacaktır%
Muhammad Aref

%Sonuna ulaşma problemini basitçe döngümün sonunda arayarak process.stdout.write('\n');çözdüm (örneğin, varsa)
Muhammed Aref

2
%Sadece dosyanın sonunda hiçbir satır yoktur demenin Shell'in yoludur.
Dave Newton

1
Eğer bir dosyaya programın çıktısı yönlendirme eğer, örneğin, şunu alır anlamına gelir çünkü sizin bakış @DaveNewton önemlidir %dosyasında
mr.mams

31

Belirtilmeyen büyük bir fark, process.stdout öğesinin yalnızca dizeleri bağımsız değişken olarak almasıdır (ayrıca akışlar da olabilir), console.log herhangi bir Javascript veri türünü alır.

Örneğin:

// ok
console.log(null)
console.log(undefined)
console.log('hi')
console.log(1)
console.log([1])
console.log({one:1})
console.log(true)
console.log(Symbol('mysymbol'))

// any other data type passed as param will throw a TypeError
process.stdout.write('1')

// can also pipe a readable stream (assuming `file.txt` exists)
const fs = require('fs')
fs.createReadStream('file.txt').pipe(process.stdout)

15

Bu bağlamdaki bir diğer önemli fark process.stdout.clearLine()veprocess.stdout.cursorTo(0) .

Yalnızca bir satırdaki indirme veya işleme yüzdesini göstermek istiyorsanız bu yararlı olacaktır. ClearLine () kullanırsanız, cursorTo () console.log()işlevi metne \ n de eklendiğinden çalışmaz. Sadece bu örneği deneyin:

var waitInterval = 500;
var totalTime = 5000;
var currentInterval = 0;

function showPercentage(percentage){
    process.stdout.clearLine();
    process.stdout.cursorTo(0);
    console.log(`Processing ${percentage}%...` ); //replace this line with process.stdout.write(`Processing ${percentage}%...`);
}

var interval = setInterval(function(){
 currentInterval += waitInterval;
 showPercentage((currentInterval/totalTime) * 100);
}, waitInterval);

setTimeout(function(){
 clearInterval(interval); 
}, totalTime);

Aradığım şey bu. Teşekkürler.
Patrick P.

5

Ben sadece postps yöntemi için https.request ile ilgili yardım aldıktan sonra araştırma yaparken bir şey fark ettim. Anlamaya yardımcı olacak bazı girdileri paylaştığımı düşündüm.

process.stdout.writeconsole.logdiğerlerinin de belirttiği gibi yeni bir satır eklemez . Ancak örneklerle açıklanması daha kolay olan bu da var.

var req = https.request(options, (res) => {
    res.on('data', (d) => {
        process.stdout.write(d);
        console.log(d)
    });
});

process.stdout.write(d);yeni bir satır olmadan verileri düzgün bir şekilde yazdırır. Ancak console.log(d)yeni bir satır yazdırılacak, ancak veriler düzgün gösterilmeyecek ve<Buffer 12 34 56... örneğin .

Yapmak için console.log(d)doğru bilgi göstermek, bunu yapmak gerekir.

var req = https.request(options, (res) => {
    var dataQueue = "";    
    res.on("data", function (d) {
        dataQueue += d;
    });
    res.on("end", function () {
        console.log(dataQueue);
    });
});

Temel olarak:

  • process.stdout.write sürekli olarak alınan veri olarak bilgileri yazdırır ve yeni bir satır eklemez.

  • console.log alınan noktadan elde edilen bilgileri basar ve yeni bir satır ekler.

Bunu açıklamanın en iyi yolu bu.


1

Basit Fark: console.log () yöntemleri otomatik olarak yeni satır karakteri ekler. Bu, sonucun üzerinden geçiyor ve yazdırıyor olsak, her sonuç yeni bir satıra yazdırılır.

process.stdout.write () yöntemleri yeni satır karakteri eklemez. baskı desenleri için kullanışlıdır.


0

Console.log Gerçekleştirmek process.sdout.write, process.sdout.write, doğrudan konsolunuzdan çıktı alacak bir arabellek / akıştır.

Benim puglin göre serverline : console = new Console(consoleOptions)kendinizinkiyle Konsol sınıfını yeniden yazabilirsiniz taleb sistemine.

Console.log'un kod kaynağını görebilirsiniz:


Daha fazla gör :

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.