Node.js: stampa su console senza una nuova riga finale?


683

Esiste un metodo per stampare sulla console senza una nuova riga finale? La documentazioneconsole dell'oggetto non dice nulla al riguardo:

console.log()

Stampa su stdout con newline. Questa funzione può accettare più argomenti in printf()modo simile. Esempio:

console.log('count: %d', count);

Se gli elementi di formattazione non vengono trovati nella prima stringa, util.inspectvengono utilizzati su ciascun argomento.

Risposte:


1058

Puoi usare process.stdout.write():

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

Vedi i documenti per i dettagli .


7
Ciò ha risolto il problema opposto per me. console.logstava \nletteralmente stampando quando volevo che stampasse un personaggio newline.
Paul,

@Paulpro non è '\ n' il carattere newline?
Alexander Mills,

3
@AlexMills È la sequenza di escape per un personaggio newline, ma non è un personaggio newline stesso. Stavo diventando letteralmente ` followed by an n, quando volevo creare un vero personaggio newline.
Paul,

379

Inoltre, se si desidera sovrascrivere i messaggi nella stessa riga, ad esempio in un conto alla rovescia, è possibile aggiungere "\ r" alla fine della stringa.

process.stdout.write("Downloading " + data.length + " bytes\r");

18
Sebbene non sia la risposta alla domanda, questa è una risposta straordinaria. Non vedo l'ora di provare.
Longda,

8
Questo non funziona su Windows per me. Ma funziona alla grande su non-dows.
Chowey,

45
Per Windows, puoi utilizzare il codice equivalente '\ 033 [0G', come in:process.stdout.write("Downloading " + data.length + " bytes\033[0G");
GarciadelCastillo

19
Per rendere il codice di escape ANSI di cui sopra in un commento di @GarciadelCastillo al lavoro in modalità rigorosa, sostituire il ottale letterale \033con il valore letterale esadecimale \x1bin questo modo: \x1b[0G. (che funziona con codice sia rigido che non rigido)
circa il

7
Metti il ​​\ r all'inizio piuttosto che alla fine della stringa per farlo funzionare in Windows.
daremkd,

20

Nella console di Windows (anche Linux), è necessario sostituire '\r'con il suo codice equivalente \033[0G:

process.stdout.write('ok\033[0G');

Questo utilizza una sequenza di escape del terminale VT220 per inviare il cursore alla prima colonna.


1
Come torneresti indietro di più righe anziché solo la riga corrente? Il programma principale sembra essere in grado di sovrascrivere il mio intero buffer mentre è in esecuzione e ripristina ciò che era lì quando è stato fatto. Qualcuno sa come fa? i.imgur.com/AtCmEjn.gif
Chev,

Credo che probabilmente usi qualcosa come uno di questi: github.com/mscdex/node-ncurses github.com/chjj/blessed
Brandon

1
Funziona ma ottengo anche il cursore [\] 39e il cursore viene evidenziato sul primo carattere:var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
loretoparisi,

1
@Chev Top è speciale, non qualcosa che puoi scrivere con i codici di escape ANSI. In effetti, utilizza ncurses ed è per questo che non lo troverai su sistemi embedded che non hanno librerie C di grandi dimensioni
cat

1
@Chev: Molte persone ti dissuaderanno dal giocare con sequenze di escape hardcoded a causa del loro FUD, ma quasi tutti usano VT100 ora, quindi la compatibilità non è più un problema. La funzionalità a cui ti riferisci è il comportamento "schermo alternativo". Un'introduzione di base è disponibile in man console_codes(su Linux o online) e il mio riferimento preferito è www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/… (il 99% dei suoi contenuti funziona ancora) . Unico avvertimento: preparatevi a testare qualsiasi esperimento su diversi terminali diversi prima di dispiegare ampiamente.
i336_

18

Come espansione / miglioramento della brillante aggiunta fatta sopra da @rodowi per quanto riguarda la possibilità di sovrascrivere una riga:

process.stdout.write("Downloading " + data.length + " bytes\r");

Se non vuoi che il cursore terminale si trovi sul primo carattere, come ho visto nel mio codice, considera di fare quanto segue:

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)

Posizionando il \rdavanti alla successiva istruzione di stampa, il cursore viene ripristinato appena prima che la stringa di sostituzione sovrascriva la precedente.


13

util.print può anche essere usato. Leggi: http://nodejs.org/api/util.html#util_util_print

util.print ([...]) # Una funzione di uscita sincrona. Bloccherà il processo, eseguirà il cast di ogni argomento su una stringa, quindi l'output su stdout. Non inserisce nuove righe dopo ogni argomento.

Un esempio:

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

39
util.printè deprecato ora
Petr Peller,

(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
Verde,

10

Sembra che ci siano molte risposte che suggeriscono:

process.stdout.write

I log degli errori devono essere emessi su:

process.stderr

Invece usa:

console.error

Per chiunque si chieda perché process.stdout.write('\033[0G');non stia facendo nulla è perché stdoutè bufferizzato e devi attendere l' drainevento ( maggiori informazioni ).

Se la scrittura ritorna falsegenererà un drainevento.


4

Nessuna di queste soluzioni funziona per me process.stdout.write('ok\033[0G')e solo usando '\r'semplicemente creare una nuova linea ma non sovrascrivere su Mac OSX 10.9.2.

EDIT: ho dovuto usare questo per sostituire la riga corrente:

process.stdout.write('\033[0G');
process.stdout.write('newstuff');

4

Ho ricevuto il seguente errore quando si utilizza la modalità rigorosa:

Errore nodo: "I letterali ottali non sono consentiti in modalità rigorosa".

La seguente soluzione funziona ( fonte ):

process.stdout.write("received: " + bytesReceived + "\x1B[0G");

Cambia il formato numerico obstal letterale tobsone.orher
FrancescoMM,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.