web-dev-qa-db-fra.com

Node.js: imprimer sur une console sans fin de ligne nouvelle?

Existe-t-il une méthode pour imprimer sur la console sans nouvelle ligne de fin? L'objet consoledocumentation ne dit rien à ce sujet:

console.log()

Imprime sur la sortie standard avec une nouvelle ligne. Cette fonction peut prendre plusieurs arguments de la même manière que printf()-. 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é pour chaque argument.

606
Evan Carroll

Vous pouvez utiliser process.stdout.write():

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

Voir le docs for details .

939
onteria_

De plus, si vous souhaitez écraser des messages sur 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");
346
defvol

Dans la console Windows (Linux également), 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.

18
Yan Te

En tant qu'extension/amélioration du brillant ajout fait par @rodowi ci-dessus en ce qui concerne la possibilité d'écraser une ligne:

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

Si vous ne voulez pas que le curseur du terminal soit situé sur le premier caractère, comme je l'ai vu dans mon code, envisagez ce qui 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 devant l'instruction d'impression suivante, le curseur est réinitialisé juste avant que la chaîne de remplacement remplace la précédente.

14
mraxus

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

util.print ([...]) # Une fonction de sortie synchrone. Bloque le processus, transforme chaque argument en chaîne puis affiche le résultat 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
douyw

Il semble y avoir beaucoup de réponses suggérant process.stdout.write. Les journaux d'erreur doivent être émis sur process.stderr à la place (Utilisez console.error). Pour ceux qui se demandent pourquoi process.stdout.write ('\ 033 [0G'); ne faisait rien, c'est que stdout est mis en mémoire tampon et que vous devez attendre l'événement drain (voir vidage Stdout pour NodeJS? ). Si write renvoie false, un événement drain est déclenché.

9
Ahmed Masud

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 pas écraser, Mac OSX 10.9.2

EDIT: je devais l'utiliser pour remplacer la ligne actuelle

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

4
Tyguy7

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

Erreur de nœud: "Les littéraux octaux 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 ("receive:" + bytesReceived + "\ x1B [0G");

4
blablabla