Unterschied zwischen "process.stdout.write" und "console.log" in node.js?


323

Was ist der Unterschied zwischen "process.stdout.write" und "console.log" in node.js?

BEARBEITEN: Die Verwendung von console.log für eine Variable zeigte viele unlesbare Zeichen, während die Verwendung von process.stdout.write ein Objekt zeigte.

Warum ist das so?


4
Können Sie ein Beispiel geben? console.log () ruft process.stdout.write mit formatierter Ausgabe auf. Siehe format () in console.js für die Implementierung.
TK-421

Antworten:


324

console.log()Aufrufe process.stdout.writemit formatierter Ausgabe. format()Informationen zur Implementierung finden Sie in console.js.

Derzeit (v0.10.ish):

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

34
Erwähnenswert ist auch, dass console.log()eine neue
Zeile

143

Wenn Sie sich die Node-Dokumente ansehen, ist console.log anscheinend nur process.stdout.write mit einem Zeilenumbruch am Ende:

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

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


18
Für Leute, die später vorbeikommen, beachten Sie bitte, dass v0.3.1 schon lange her ist und sich die Dinge seitdem geändert haben. :)
Brendan

5
...Nee. Gerade in v0.9.9 docs angesehen und console.log ist immer noch nur ein Alias ​​für process.stdout.write mit einem Zeilenumbruch. Bitte recherchieren Sie vor dem Kommentieren. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford

13
1) v0.9.9 ist zwei Jahre alt 2) diese Dokumentation ist falsch, gemäß v0.9.9 wird das Format durch util
Brendan

4
Tatsächlich scheint es, dass diese Dokumentation nie aktualisiert wurde und immer noch existiert (DRY irgendjemand?). Ich werde eine PR einreichen, um das zu beheben, danke, dass Sie mich über dieses Problem informiert haben :)
Brendan


66

Ich weiß, dass dies eine sehr alte Frage ist, aber ich habe niemanden gesehen, der über den Hauptunterschied zwischen process.stdout.writeund gesprochen hat, console.logund ich möchte es nur erwähnen.

Wie Mauvis Leford und TK-421 betonten , console.logfügt line-breakdas am Ende der Zeile ein Zeichen hinzu ( \n), aber das ist noch nicht alles.

Der Code hat sich seit mindestens der 0.10.XVersion nicht geändert und jetzt haben wir eine 5.XVersion.

Hier ist der Code:

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

Wie Sie sehen können, gibt es einen Teil, der besagt, .apply(this, arguments)dass die Funktionalität einen großen Unterschied macht. Es ist einfacher, dies anhand von Beispielen zu erklären:

process.stdout.write hat eine sehr grundlegende Funktionalität, Sie können einfach etwas darin schreiben, wie folgt:

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

Wenn Sie die Bruchlinie nicht am Ende setzen, erhalten Sie nach Ihrer Zeichenfolge ein seltsames Zeichen, etwa so:

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

(Ich denke, das bedeutet so etwas wie "das Ende des Programms", sodass Sie es nur sehen, wenn Sie process.stdout.writeam Ende Ihrer Datei verwendet wurden und die Unterbrechungslinie nicht hinzugefügt haben.)

Auf der anderen Seite console.logkann mehr tun.

  1. Sie können es auf die gleiche Weise verwenden

    console.log("Hello World"); //You don't need the break line here because it was already formated und auch dieser seltsame Charakter verschwand

  2. Sie können mehr als eine Zeichenfolge schreiben

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

  3. Sie können Assoziationen herstellen

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

Und das war's, dass dank des util.format.applyTeils zusätzliche Funktionalität gegeben ist (ich könnte viel darüber sprechen, was genau dies bewirkt, aber Sie verstehen, dass Sie hier mehr lesen können ).

Ich hoffe, jemand findet diese Informationen nützlich.


Es wäre auch sehr hilfreich, wenn Sie erklären würden, wie man verwendet stdout.writeund vermeidet%
Muhammad Aref

Ich löste das Problem, %am Ende zu sein, indem ich einfach process.stdout.write('\n');am Ende meiner Schleife anrief (wenn Sie zum Beispiel haben)
Muhammad Aref

2
Das %ist nur die Art und Weise der Shell sagt es am Ende der Datei kein Newline ist.
Dave Newton

1
@ DaveNewton Ihr Punkt ist wichtig, denn wenn Sie beispielsweise die Ausgabe Ihres Programms in eine Datei umleiten, erhalten Sie diese nicht %in der Datei
mr.mams

31

Ein großer Unterschied, der nicht erwähnt wurde, ist, dass process.stdout nur Zeichenfolgen als Argumente verwendet (kann auch als Piping- Streams verwendet werden), während console.log einen beliebigen Javascript-Datentyp verwendet.

z.B:

// 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

Ein weiterer wichtiger Unterschied in diesem Zusammenhang wäre mit process.stdout.clearLine()und process.stdout.cursorTo(0).

Dies ist nützlich, wenn Sie den Prozentsatz des Downloads oder der Verarbeitung in nur einer Zeile anzeigen möchten. Wenn Sie clearLine () verwenden, funktioniert cursorTo () console.log()damit nicht, da es auch \ n an den Text anfügt . Probieren Sie einfach dieses Beispiel aus:

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);

Das ist was ich suche. Vielen Dank.
Patrick P.

5

Ich habe gerade etwas bemerkt, als ich dies recherchiert habe, nachdem ich Hilfe bei https.request für die Post-Methode erhalten hatte. Ich dachte, ich teile einige Beiträge, um das Verständnis zu verbessern.

process.stdout.writefügt währenddessen console.logkeine neue Zeile hinzu , wie andere erwähnt hatten. Aber es gibt auch das, was mit Beispielen leichter zu erklären ist.

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

process.stdout.write(d);druckt die Daten ordnungsgemäß ohne neue Zeile. Es console.log(d)wird jedoch eine neue Zeile gedruckt, aber die Daten werden nicht korrekt angezeigt, <Buffer 12 34 56...z. B. dies.

Um console.log(d)die Informationen korrekt anzuzeigen, müsste ich dies tun.

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

Also im Grunde genommen:

  • process.stdout.write Gibt die Informationen kontinuierlich aus, während die Daten abgerufen werden, und fügt keine neue Zeile hinzu.

  • console.log druckt die Informationen aus, die zum Zeitpunkt des Abrufs erhalten wurden, und fügt eine neue Zeile hinzu.

So kann ich es am besten erklären.


1

Der einfache Unterschied besteht darin, dass die Methoden console.log () automatisch neue Zeilenzeichen anhängen. Dies bedeutet, dass jedes Ergebnis in einer neuen Zeile gedruckt wird, wenn wir das Ergebnis durchlaufen und drucken.

Die Methoden process.stdout.write () hängen kein neues Zeilenzeichen an. nützlich zum Drucken von Mustern.


0

Console.log implementiert process.sdout.write, process.sdout.write ist ein Puffer / Stream, der direkt in Ihrer Konsole ausgegeben wird.

Laut meiner Puglin- Serverlinie : console = new Console(consoleOptions)Sie können die Konsolenklasse mit Ihrem eigenen Readline- System neu schreiben .

Sie können die Codequelle von console.log sehen:


Mehr sehen :

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.