Perbedaan antara "process.stdout.write" dan "console.log" di node.js?

323

Apa perbedaan antara "process.stdout.write" dan "console.log" di node.js?

EDIT: Menggunakan console.log untuk variabel menunjukkan banyak karakter yang tidak dapat dibaca saat menggunakan process.stdout.write menunjukkan sebuah objek.

Mengapa demikian?

ajsie
sumber
4
Bisakah Anda memberikan contoh? console.log () memanggil proses.stdout.write dengan output yang diformat. Lihat format () di console.js untuk implementasi.
TK-421

Jawaban:

324

console.log()panggilan process.stdout.writedengan output yang diformat. Lihat format()di console.js untuk implementasinya.

Saat ini (v0.10.ish):

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};
TK-421
sumber
34
Juga layak disebutkan yang console.log()tampaknya menambahkan baris baru
jchook
144

Melihat Node docs tampaknya console.log hanyalah proses.stdout.write dengan garis-putus di akhir:

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

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

Mauvis Ledford
sumber
18
Untuk orang-orang yang datang kemudian, harap dicatat bahwa v0.3.1 sudah lama sekali dan banyak hal telah berubah sejak saat itu. :)
Brendan
5
...nggak. Hanya melihat v0.9.9 docs dan console.log masih merupakan alias untuk memproses.stdout.write dengan linebreak. Silakan lakukan riset Anda sebelum berkomentar. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford
13
1) v0.9.9 berumur dua tahun 2) dokumentasi tidak benar, seperti v0.9.9 format diinterpolasi melalui util
Brendan
4
Sebenarnya, sepertinya dokumentasi itu belum pernah diperbarui dan masih ada (KERING siapa pun?). Saya akan mengajukan PR untuk memperbaikinya, terima kasih telah memberi tahu saya tentang masalah itu :)
Brendan
66

Saya tahu ini adalah pertanyaan yang sangat lama tetapi saya tidak melihat ada yang berbicara tentang perbedaan utama antara process.stdout.writedan console.logdan saya hanya ingin menyebutkannya.

Seperti Mauvis Leford dan TK-421 tunjukkan, console.logmenambahkan line-breakkarakter di akhir baris ( \n) tapi itu tidak semua yang dilakukannya.

Kode tidak berubah sejak 0.10.Xversi setidaknya dan sekarang kami memiliki 5.Xversi.

Ini kodenya:

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

Seperti yang Anda lihat, ada bagian yang mengatakan .apply(this, arguments)dan itu membuat perbedaan besar pada fungsionalitas. Lebih mudah dijelaskan dengan contoh:

process.stdout.write memiliki fungsi yang sangat mendasar, Anda bisa menulis sesuatu di sana, seperti ini:

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

Jika Anda tidak meletakkan garis putus-putus di akhir, Anda akan mendapatkan karakter aneh setelah string Anda, sesuatu seperti ini:

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

(Saya pikir itu berarti sesuatu seperti "akhir dari program", jadi Anda akan melihatnya hanya jika Anda process.stdout.writedigunakan di akhir file Anda dan Anda tidak menambahkan garis putus-putus)

Di sisi lain, console.logbisa berbuat lebih banyak.

  1. Anda bisa menggunakannya dengan cara yang sama

    console.log("Hello World"); //You don't need the break line here because it was already formated dan juga karakter aneh itu menghilang

  2. Anda dapat menulis lebih dari satu string

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

  3. Anda dapat membuat asosiasi

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

Yang itu saja, bahwa fungsionalitas tambahan diberikan berkat util.format.applybagian itu (saya bisa berbicara banyak tentang apa sebenarnya ini tetapi Anda mengerti maksud saya, Anda dapat membaca lebih lanjut di sini ).

Saya harap seseorang menemukan informasi ini berguna.

Gepser
sumber
Akan sangat membantu juga jika Anda menjelaskan cara menggunakan stdout.writedan menghindari mendapatkan%
Muhammad Aref
Saya memecahkan masalah mendapatkan %di akhir hanya dengan menelepon process.stdout.write('\n');di akhir loop saya (jika Anda punya misalnya)
Muhammad Aref
2
Ini %hanya cara shell untuk mengatakan tidak ada baris baru di akhir file.
Dave Newton
1
@DaveNewton poin Anda penting, karena itu berarti bahwa jika Anda mengarahkan output program Anda ke file, misalnya, Anda tidak akan mendapatkan itu %di file
mr.mams
31

Satu perbedaan besar yang belum disebutkan adalah bahwa process.stdout hanya mengambil string sebagai argumen (bisa juga berupa piped stream), sedangkan console.log mengambil tipe data Javascript apa pun.

misalnya:

// 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)
thelostspore
sumber
15

Perbedaan penting lainnya dalam konteks ini adalah dengan process.stdout.clearLine()dan process.stdout.cursorTo(0).

Ini akan berguna jika Anda ingin menunjukkan persentase pengunduhan atau pemrosesan hanya dalam satu baris. Jika Anda menggunakan clearLine (), cursorTo () dengan console.log()itu tidak berfungsi karena itu juga menambahkan \ n ke teks. Coba saja contoh ini:

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);
saikirann
sumber
Ini yang saya cari. Terima kasih.
Patrick P.
5

Saya baru saja memperhatikan sesuatu saat meneliti ini setelah mendapatkan bantuan dengan https.request untuk metode posting. Pikir saya membagikan beberapa masukan untuk membantu memahami.

process.stdout.writetidak menambahkan baris baru sementara console.log, seperti yang telah disebutkan orang lain. Tetapi ada juga ini yang lebih mudah dijelaskan dengan contoh.

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

process.stdout.write(d);akan mencetak data dengan benar tanpa baris baru. Namun console.log(d)akan mencetak baris baru tetapi data tidak akan ditampilkan dengan benar, memberikan ini <Buffer 12 34 56...misalnya.

Untuk console.log(d)menunjukkan informasi dengan benar, saya harus melakukan ini.

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

Jadi pada dasarnya:

  • process.stdout.write terus mencetak informasi saat data diambil dan tidak menambah baris baru.

  • console.log mencetak informasi apa yang diperoleh pada titik pengambilan dan menambahkan baris baru.

Itu cara terbaik yang bisa saya jelaskan.

Nova
sumber
1

Perbedaan Sederhana adalah: metode console.log () secara otomatis menambahkan karakter baris baru. Ini berarti jika kita mengulang dan mencetak hasilnya, setiap hasil dicetak dalam baris baru.

metode process.stdout.write () tidak menambahkan karakter baris baru. berguna untuk mencetak pola.

Rishu Anand
sumber
0

Console.log implement process.sdout.write, process.sdout.write adalah buffer / stream yang akan langsung ditampilkan di konsol Anda.

Menurut serverlin puglin saya : console = new Console(consoleOptions)Anda dapat menulis ulang kelas konsol dengan sistem readline Anda sendiri .

Anda dapat melihat sumber kode console.log:


Lihat lebih lanjut:

A-312
sumber