Différence entre «process.stdout.write» et «console.log» dans node.js?


323

Quelle est la différence entre "process.stdout.write" et "console.log" dans node.js?

EDIT: L'utilisation de console.log pour une variable a montré beaucoup de caractères illisibles tandis que l'utilisation de process.stdout.write a montré un objet.

Pourquoi donc?


4
Pouvez vous donner un exemple? console.log () appelle process.stdout.write avec une sortie formatée. Voir format () dans console.js pour l'implémentation.
TK-421

Réponses:


324

console.log()appels process.stdout.writeavec sortie formatée. Voir format()dans console.js pour l'implémentation.

Actuellement (v0.10.ish):

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};

34
Il convient également de mentionner qu'il console.log()semble ajouter une nouvelle ligne
jchook

144

En regardant les documents Node, apparemment console.log est juste process.stdout.write avec un saut de ligne à la fin:

console.log = function (d) {
  process.stdout.write(d + '\n');
};

Source: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout


18
Pour les gens qui viendront plus tard, veuillez noter que la v0.3.1 était il y a longtemps et que les choses ont changé depuis. :)
Brendan

5
...Nan. Je viens de regarder les documents v0.9.9 et console.log n'est encore qu'un alias pour process.stdout.write avec un saut de ligne. Veuillez faire vos recherches avant de commenter. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford

13
1) v0.9.9 a deux ans 2) que la documentation est incorrecte, selon v0.9.9 le format est interpolé par util
Brendan

4
En fait, il semble que cette documentation n'ait jamais été mise à jour et soit toujours là (DRY quiconque?). Je vais soumettre un PR pour résoudre ce problème, merci de m'avoir informé de ce problème :)
Brendan


66

Je sais que c'est une très vieille question, mais je n'ai vu personne parler de la principale différence entre process.stdout.writeet console.loget je veux juste la mentionner.

Comme Mauvis Leford et TK-421 l'ont souligné, le console.logajoute un line-breakcaractère à la fin de la ligne ( \n) mais ce n'est pas tout ce qu'il fait.

Le code n'a pas changé depuis au moins la 0.10.Xversion et maintenant nous avons une 5.Xversion.

Voici le code:

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};

Comme vous pouvez le voir, il y a une partie qui dit .apply(this, arguments)et qui fait une grande différence sur la fonctionnalité. Il est plus facile d'expliquer cela avec des exemples:

process.stdout.write a une fonctionnalité très basique, vous pouvez simplement écrire quelque chose dedans, comme ceci:

process.stdout.write("Hello World\n"); 

Si vous ne mettez pas la ligne de rupture à la fin, vous obtiendrez un caractère étrange après votre chaîne, quelque chose comme ceci:

process.stdout.write("Hello World"); //Hello World% 

(Je pense que cela signifie quelque chose comme "la fin du programme", donc vous ne le verrez que si vous avez process.stdout.writeété utilisé à la fin de votre fichier et que vous n'avez pas ajouté la ligne de rupture)

D'un autre côté, console.logpeut faire plus.

  1. Vous pouvez l'utiliser de la même manière

    console.log("Hello World"); //You don't need the break line here because it was already formated et aussi ce personnage bizarre a disparu

  2. Vous pouvez écrire plusieurs chaînes

    console.log("Hello", "World");

  3. Vous pouvez faire des associations

    console.log("Hello %s", "World") //Useful when "World" is inside a variable

util.format.applyEt c'est tout, cette fonctionnalité supplémentaire est donnée grâce à la partie (je pourrais parler beaucoup de ce que cela fait exactement, mais vous comprenez mon point, vous pouvez en lire plus ici ).

J'espère que quelqu'un trouvera ces informations utiles.


Il serait également très utile que vous expliquiez comment utiliser stdout.writeet éviter de vous faire%
Muhammad Aref

J'ai résolu le problème d'arriver %à la fin en appelant simplement process.stdout.write('\n');à la fin de ma boucle (si vous l'avez par exemple)
Muhammad Aref

2
C'est %juste la façon dont le shell dit qu'il n'y a pas de nouvelle ligne à la fin du fichier.
Dave Newton

1
@DaveNewton votre point est important, car cela signifie que si vous redirigez la sortie de votre programme vers un fichier, par exemple, vous n'obtiendrez pas cela %dans le fichier
mr.mams

31

Une grande différence qui n'a pas été mentionnée est que process.stdout ne prend que des chaînes comme arguments (peut également être des flux canalisés), tandis que console.log prend n'importe quel type de données Javascript.

par exemple:

// ok
console.log(null)
console.log(undefined)
console.log('hi')
console.log(1)
console.log([1])
console.log({one:1})
console.log(true)
console.log(Symbol('mysymbol'))

// any other data type passed as param will throw a TypeError
process.stdout.write('1')

// can also pipe a readable stream (assuming `file.txt` exists)
const fs = require('fs')
fs.createReadStream('file.txt').pipe(process.stdout)

15

Une autre différence importante dans ce contexte serait avec process.stdout.clearLine()et process.stdout.cursorTo(0).

Cela serait utile si vous souhaitez afficher le pourcentage de téléchargement ou de traitement sur la seule ligne. Si vous utilisez clearLine (), cursorTo () avec console.log()cela ne fonctionne pas car il ajoute également \ n au texte. Essayez cet exemple:

var waitInterval = 500;
var totalTime = 5000;
var currentInterval = 0;

function showPercentage(percentage){
    process.stdout.clearLine();
    process.stdout.cursorTo(0);
    console.log(`Processing ${percentage}%...` ); //replace this line with process.stdout.write(`Processing ${percentage}%...`);
}

var interval = setInterval(function(){
 currentInterval += waitInterval;
 showPercentage((currentInterval/totalTime) * 100);
}, waitInterval);

setTimeout(function(){
 clearInterval(interval); 
}, totalTime);

Voilà ce que je recherche. Merci.
Patrick P.

5

Je viens de remarquer quelque chose lors de mes recherches après avoir obtenu de l'aide avec la méthode https.request for post. Je pensais partager quelques informations pour aider à comprendre.

process.stdout.writen'ajoute pas de nouvelle ligne tandis console.logque, comme d'autres l'ont mentionné. Mais il y a aussi cela qui est plus facile à expliquer avec des exemples.

var req = https.request(options, (res) => {
    res.on('data', (d) => {
        process.stdout.write(d);
        console.log(d)
    });
});

process.stdout.write(d);imprimera les données correctement sans nouvelle ligne. Cependant console.log(d), une nouvelle ligne sera imprimée mais les données ne s'afficheront pas correctement, ce qui donne ceci <Buffer 12 34 56...par exemple.

Pour faire console.log(d)afficher correctement les informations, je devrais le faire.

var req = https.request(options, (res) => {
    var dataQueue = "";    
    res.on("data", function (d) {
        dataQueue += d;
    });
    res.on("end", function () {
        console.log(dataQueue);
    });
});

Donc en gros:

  • process.stdout.write imprime en continu les informations en tant que données récupérées et n'ajoute pas de nouvelle ligne.

  • console.log imprime les informations obtenues au point de récupération et ajoute une nouvelle ligne.

C'est la meilleure façon de l'expliquer.


1

La différence simple est la suivante: les méthodes console.log () ajoutent automatiquement un nouveau caractère de ligne. Cela signifie que si nous parcourons et imprimons le résultat, chaque résultat est imprimé sur une nouvelle ligne.

Les méthodes process.stdout.write () n'ajoutent pas de nouveau caractère de ligne. utile pour l'impression de motifs.


0

Console.log implémente process.sdout.write, process.sdout.write est un tampon / flux qui sortira directement dans votre console.

Selon ma ligne de serveur puglin : console = new Console(consoleOptions)vous pouvez réécrire la classe Console avec votre propre système readline .

Vous pouvez voir la source de code de console.log:


Voir plus:

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.