wake-up-neo.com

Node.js: Drucken auf der Konsole ohne Zeilenumbruch?

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.

606
Evan Carroll

Sie können process.stdout.write() verwenden:

process.stdout.write("hello: ");

Einzelheiten finden Sie in docs .

939
onteria_

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");
346
defvol

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.

18
Yan Te

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.

14
mraxus

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");
});
13
douyw

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.

9
Ahmed Masud

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

4
Tyguy7

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

4
blablabla