Question Node.js: impression sur la console sans retour à la ligne?


Existe-t-il une méthode d'impression sur la console sans retour chariot? le console objet Documentation ne dit rien à ce sujet:

console.log()

Imprime sur stdout avec newline. Cette fonction peut prendre plusieurs arguments dans un printf()-comme manière. Exemple:

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

Si les éléments de formatage ne sont pas trouvés dans la première chaîne, alors util.inspect est utilisé sur chaque argument.


499
2018-05-27 20:42


origine


Réponses:


Vous pouvez utiliser process.stdout.write():

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

Voir le docs pour les détails.


776
2018-05-27 20:51



De plus, si vous souhaitez écraser les messages dans la même ligne, par exemple dans un compte à rebours, vous pouvez ajouter '\ r' à la fin de la chaîne.

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

310
2018-03-09 04:26



Dans la console Windows (Linux aussi), vous devez remplacer '\ r' par son code équivalent \ 033 [0G:

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

Ceci utilise une séquence d'échappement du terminal VT220 pour envoyer le curseur à la première colonne.


14
2018-01-28 16:52



util.print peut être utilisé aussi. Lis: http://nodejs.org/api/util.html#util_util_print

util.print ([...]) #   Une fonction de sortie synchrone. Permet de bloquer le processus, de convertir chaque argument en une chaîne puis de le sortir sur stdout. Ne place pas de nouvelles lignes après chaque argument.

Un exemple:

// 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
2017-11-15 13:02



Il semble y avoir beaucoup de réponses suggérant process.stdout.write. Les journaux d'erreurs doivent être émis sur process.stderr à la place (Utiliser console.error). Pour ceux qui se demandent pourquoi process.stdout.write ('\ 033 [0G']; ne faisait rien parce que stdout est tamponné et vous devez attendre drain événement (Voir Stdout flush pour NodeJS?). Si write renvoie false, il déclenchera un drain un événement.


4
2017-08-18 01:40



Aucune de ces solutions ne fonctionne pour moi. process.stdout.write ('ok \ 033 [0G') et en utilisant simplement '\ r' créez simplement une nouvelle ligne, ne remplacez pas Mac OSX 10.9.2

EDIT: je devais utiliser cela pour remplacer la ligne actuelle

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


3
2018-04-04 18:44



J'ai eu une erreur en utilisant le mode strict.

Erreur de noeud: "Les littéraux Octal ne sont pas autorisés en mode strict."

J'ai trouvé la réponse ici: https://github.com/SBoudrias/Inquirer.js/issues/111

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


3
2017-09-30 08:48



Comme une extension / amélioration de la brillante addition faite par @rodowi ci-dessus concernant la possibilité d'écraser une ligne:

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

Si vous ne souhaitez pas que le curseur du terminal se trouve au premier caractère, comme je l'ai vu dans mon code, envisagez de procéder comme suit:

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)

En plaçant le \r en face de l'instruction d'impression suivante, le curseur est réinitialisé juste avant que la chaîne de remplacement remplace la précédente.


1
2017-12-27 00:33