Różnica między „process.stdout.write” a „console.log” w node.js?

323

Jaka jest różnica między „process.stdout.write” a „console.log” w node.js?

EDYCJA: Użycie console.log dla zmiennej pokazało wiele nieczytelnych znaków, natomiast użycie process.stdout.write pokazało obiekt.

Dlaczego?

ajsie
źródło
4
Czy możesz podać przykład? console.log () wywołuje proces.stdout.write ze sformatowanym wyjściem. Aby zapoznać się z implementacją, zobacz format () w console.js.
TK-421

Odpowiedzi:

324

console.log()wywołania process.stdout.writeze sformatowanym wyjściem. Zobacz format()implementację w pliku console.js.

Obecnie (v0.10.ish):

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};
TK-421
źródło
34
Warto również wspomnieć, że console.log()wydaje się, że dodaje nowy wiersz
jchook
144

Patrząc na dokumenty Node najwyraźniej console.log to po prostu process.stdout.write z podziałem linii na końcu:

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

Źródło: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout

Mauvis Ledford
źródło
18
Ludzie, którzy pojawią się później, powinni pamiętać, że wersja 0.3.1 była dawno temu i od tego czasu wszystko się zmieniło. :)
Brendan
5
...nie. Właśnie przejrzałem dokumentację v0.9.9, a console.log jest nadal tylko aliasem do przetwarzania.stdout.write z podziałem wiersza. Przed komentowaniem wykonaj badania. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford
13
1) v0.9.9 ma dwa lata 2) dokumentacja jest niepoprawna, zgodnie z v0.9.9 format interpolowany jest przez util
Brendan
4
W rzeczywistości wydaje się, że ta dokumentacja nigdy nie była aktualizowana i nadal istnieje (SUCHY ktoś?). Prześlę PR, aby to naprawić, dzięki za powiadomienie mnie o tym problemie :)
Brendan
66

Wiem, że to jest bardzo stare pytanie, ale nie widzę ktoś mówi o głównej różnicy między process.stdout.writei console.loga ja po prostu chce go wymienić.

Jak zauważyli Mauvis Leford i TK-421 , znak console.logdodaje line-breakznak na końcu linii ( \n), ale to nie wszystko, co robi.

Kod nie zmienił się od co najmniej 0.10.Xwersji, a teraz mamy 5.Xwersję.

Oto kod:

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

Jak widać, jest część, która mówi .apply(this, arguments)i która ma duży wpływ na funkcjonalność. Łatwiej to wyjaśnić przykładami:

process.stdout.write ma bardzo podstawową funkcjonalność, możesz po prostu coś tam napisać, na przykład:

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

Jeśli nie umieścisz linii końca na końcu, po łańcuchu otrzymasz dziwny znak, coś takiego:

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

(Myślę, że to oznacza coś w rodzaju „końca programu”, więc zobaczysz to tylko wtedy, gdy process.stdout.writebył używany na końcu pliku i nie dodałeś linii podziału)

Z drugiej strony console.logmożna zrobić więcej.

  1. Możesz użyć tego w ten sam sposób

    console.log("Hello World"); //You don't need the break line here because it was already formated a także ta dziwna postać zniknęła

  2. Możesz napisać więcej niż jeden ciąg

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

  3. Możesz tworzyć skojarzenia

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

I o to chodzi, że dzięki tej util.format.applyczęści została dodana dodatkowa funkcjonalność (mogłem dużo mówić o tym, co to dokładnie robi, ale rozumiesz, o czym więcej możesz przeczytać tutaj ).

Mam nadzieję, że ktoś uzna te informacje za przydatne.

Gepser
źródło
Byłoby bardzo pomocne, gdybyś wyjaśnił, jak używać stdout.writei jak unikać%
Muhammad Aref
Rozwiązałem problem dostania się %na koniec, po prostu dzwoniąc process.stdout.write('\n');na końcu mojej pętli (jeśli masz na przykład)
Muhammad Aref
2
Jest %to po prostu sposób powiedzenia powłoki, że na końcu pliku nie ma nowej linii.
Dave Newton
1
@DaveNewton twój punkt jest ważny, ponieważ oznacza to, że jeśli przekierujesz wyjście swojego programu do pliku, na przykład, nie dostaniesz tego %w pliku
mr.mams
31

Jedną z dużych różnic, o której nie wspomniano, jest to, że process.stdout przyjmuje tylko łańcuchy jako argumenty (mogą być również strumieniami potokowymi), podczas gdy console.log przyjmuje dowolny typ danych JavaScript.

na przykład:

// 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
źródło
15

Inną ważną różnicą w tym kontekście byłoby process.stdout.clearLine()i process.stdout.cursorTo(0).

Byłoby to przydatne, jeśli chcesz pokazać procent pobierania lub przetwarzania w jednym wierszu. Jeśli użyjesz funkcji clearLine (), kursorTo () z console.log()nią nie działa, ponieważ dodaje \ n również do tekstu. Wypróbuj ten przykład:

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
źródło
Właśnie tego szukam. Dzięki.
Patrick P.
5

Właśnie zauważyłem coś podczas badania tego po uzyskaniu pomocy w https.request dla metody post. Pomyślałem, że podzielę się pewnym wkładem, aby pomóc zrozumieć.

process.stdout.writenie dodaje nowej linii, podczas gdy console.logrobi, jak inni wspominali. Ale jest też coś, co łatwiej wyjaśnić przykładami.

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

process.stdout.write(d);wydrukuje dane poprawnie bez nowej linii. Jednak console.log(d)wydrukuje nowy wiersz, ale dane nie będą wyświetlane poprawnie, podając to <Buffer 12 34 56...na przykład.

Aby console.log(d)poprawnie wyświetlić informacje, musiałbym to zrobić.

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

Więc w zasadzie:

  • process.stdout.write ciągle drukuje informacje podczas pobierania danych i nie dodaje nowego wiersza.

  • console.log wypisuje informacje uzyskane w momencie wyszukiwania i dodaje nową linię.

To najlepszy sposób, żeby to wyjaśnić.

Nova
źródło
1

Prosta różnica polega na tym, że: metody console.log () automatycznie dodają nowy znak wiersza. Oznacza to, że jeśli przeglądamy i drukujemy wynik, każdy wynik jest drukowany w nowej linii.

Metody process.stdout.write () nie dodają nowego znaku linii. przydatne do drukowania wzorów.

Rishu Anand
źródło
0

Console.log implement process.sdout.write, process.sdout.write to bufor / strumień, który będzie bezpośrednio wysyłany do konsoli.

Według mojego puglin serverline : console = new Console(consoleOptions)można przerobić klasę Console z własnym readline systemu.

Możesz zobaczyć źródło kodu console.log:


Zobacz więcej :

A-312
źródło