Gibt es eine Methode zum Drucken auf der Konsole ohne nachfolgende Zeilenumbrüche? Das console
-Objekt Dokumentation sagt dazu nichts aus:
console.log()
Druckt mit Zeilenvorschub auf Standardausgabe. Diese Funktion kann mehrere Argumente in einer
printf()
- ähnlichen Weise annehmen. Beispiel:console.log('count: %d', count);
Wenn Formatierungselemente nicht in der ersten Zeichenfolge gefunden werden, wird
util.inspect
für jedes Argument verwendet.
Sie können process.stdout.write()
verwenden:
process.stdout.write("hello: ");
Einzelheiten finden Sie in docs .
Wenn Sie Nachrichten in derselben Zeile überschreiben möchten, z. B. in einem Countdown, können Sie am Ende der Zeichenfolge '\ r' hinzufügen.
process.stdout.write("Downloading " + data.length + " bytes\r");
In der Windows-Konsole (auch Linux) sollten Sie '\ r' durch den entsprechenden Code ersetzen \ 033 [0G:
process.stdout.write('ok\033[0G');
Hierbei wird eine Escape-Sequenz für das VT220-Terminal verwendet, um den Cursor an die erste Spalte zu senden.
Als Erweiterung/Verbesserung der brillanten Ergänzung von @rodowi, die das Überschreiben einer Zeile betrifft:
process.stdout.write("Downloading " + data.length + " bytes\r");
Wenn Sie nicht möchten, dass sich der Terminal-Cursor am ersten Zeichen befindet, wie ich es in meinem Code gesehen habe, sollten Sie Folgendes tun:
let dots = ''
process.stdout.write(`Loading `)
let tmrID = setInterval(() => {
dots += '.'
process.stdout.write(`\rLoading ${dots}`)
}, 1000)
setTimeout(() => {
clearInterval(tmrID)
console.log(`\rLoaded in [3500 ms]`)
}, 3500)
Durch Platzieren des \r
vor der nächsten print-Anweisung wird der Cursor zurückgesetzt, kurz bevor die ersetzende Zeichenfolge die vorherige überschreibt.
util.print kann auch verwendet werden. Lesen Sie: http://nodejs.org/api/util.html#util_util_print
util.print ([...]) # Eine synchrone Ausgabefunktion. Blockiert den Prozess, wandelt jedes Argument in einen String um und gibt ihn an stdout aus. Fügt nach jedem Argument keine Zeilenumbrüche ein.
Ein Beispiel:
// get total length
var len = parseInt(response.headers['content-length'], 10);
var cur = 0;
// handle the response
response.on('data', function(chunk) {
cur += chunk.length;
util.print("Downloading " + (100.0 * cur / len).toFixed(2) + "% " + cur + " bytes\r");
});
Es scheint viele Antworten zu geben, die auf process.stdout.write
hindeuten. Fehlerprotokolle sollten stattdessen auf process.stderr
ausgegeben werden (verwenden Sie console.error
). Für alle, die sich fragen, warum process.stdout.write ('\ 033 [0G'); Sie haben nichts getan, weil stdout gepuffert ist und Sie auf das Ereignis drain
warten müssen (Siehe Stdout flush for NodeJS? ). Wenn write false zurückgibt, wird ein drain
-Ereignis ausgelöst.
Keine dieser Lösungen funktioniert für mich. process.stdout.write ('ok\033 [0G') und mit '\ r' einfach eine neue Zeile erstellen, nicht überschreiben, Mac OSX 10.9.2
EDIT: Ich musste dies verwenden, um die aktuelle Zeile zu ersetzen
process.stdout.write ('\ 033 [0G'); process.stdout.write ('newstuff');
Beim Verwenden des Strict-Modus ist ein Fehler aufgetreten.
Knotenfehler: "Oktalliterale sind im strikten Modus nicht zulässig."
Ich habe die Antwort hier gefunden: https://github.com/SBoudrias/Inquirer.js/issues/111
process.stdout.write ("receive:" + bytesReceived + "\ x1B [0G");