Differenza tra "process.stdout.write" e "console.log" in node.js?


323

Qual è la differenza tra "process.stdout.write" e "console.log" in node.js?

EDIT: L'uso di console.log per una variabile ha mostrato molti caratteri illeggibili mentre process.stdout.write ha mostrato un oggetto.

Perché?


4
Puoi fornire un esempio? console.log () chiama process.stdout.write con output formattato. Vedi format () in console.js per l'implementazione.
TK-421,

Risposte:


324

console.log()chiamate process.stdout.writecon output formattato. Vedi format()in console.js per l'implementazione.

Attualmente (v0.10.ish):

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

34
Vale anche la pena ricordare che console.log()sembra aggiungere una nuova riga
jchook,

144

Guardare i documenti Node apparentemente console.log è solo process.stdout.write con un'interruzione di riga alla fine:

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

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


18
Per le persone che arrivano più tardi, tieni presente che v0.3.1 era molto tempo fa e le cose sono cambiate da allora. :)
Brendan,

5
...no. Ho appena esaminato i documenti v0.9.9 e console.log è ancora solo un alias per process.stdout.write con un'interruzione di riga. Per favore, fai le tue ricerche prima di commentare. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford

13
1) v0.9.9 ha due anni 2) che la documentazione non è corretta, come per v0.9.9 il formato è interpolato tramite util
Brendan,

4
In realtà, sembra che quella documentazione non sia mai stata aggiornata ed è ancora disponibile (DRY qualcuno?). Presenterò un PR per risolvere il problema, grazie per avermi informato di quel problema :)
Brendan,


66

So che questa è una domanda molto antica, ma non ho visto nessuno parlare della differenza principale tra process.stdout.writee console.loge voglio solo menzionarla.

Come hanno sottolineato Mauvis Leford e TK-421 , console.logaggiunge un line-breakpersonaggio alla fine della linea ( \n) ma non è tutto ciò che fa.

Il codice non è cambiato almeno dalla 0.10.Xversione e ora abbiamo una 5.Xversione.

Ecco il codice:

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

Come puoi vedere, c'è una parte che dice .apply(this, arguments)e che fa una grande differenza in termini di funzionalità. È più facile spiegarlo con esempi:

process.stdout.write ha una funzionalità di base, puoi semplicemente scrivere qualcosa lì, in questo modo:

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

Se non metti la linea di interruzione alla fine otterrai uno strano carattere dopo la tua stringa, qualcosa del genere:

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

(Penso che significhi qualcosa come "la fine del programma", quindi lo vedrai solo se sei process.stdout.writestato usato alla fine del tuo file e non hai aggiunto la linea di interruzione)

D'altra parte, console.logpuò fare di più.

  1. Puoi usarlo allo stesso modo

    console.log("Hello World"); //You don't need the break line here because it was already formated e anche quello strano personaggio è scomparso

  2. Puoi scrivere più di una stringa

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

  3. Puoi fare delle associazioni

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

E questo è tutto, quella funzionalità aggiunta è data grazie alla util.format.applyparte (potrei parlare molto di ciò che esattamente fa, ma ottieni il mio punto, puoi leggere di più qui ).

Spero che qualcuno trovi utile questa informazione.


Sarebbe molto utile anche se spiegassi come usare stdout.writeed evitare di ottenere%
Muhammad Aref,

Ho risolto il problema di arrivare %alla fine semplicemente chiamando process.stdout.write('\n');alla fine del mio ciclo (se hai per esempio)
Muhammad Aref,

2
Il %è solo modo della shell di dire non c'è alcuna nuova riga alla fine del file.
Dave Newton,

1
@DaveNewton il tuo punto è importante, perché significa che se stai reindirizzando l'output del tuo programma su un file, ad esempio, non lo otterrai %nel file
mr.mams

31

Una grande differenza che non è stata menzionata è che process.stdout accetta solo stringhe come argomenti (può anche essere convogliato in streaming), mentre console.log accetta qualsiasi tipo di dati Javascript.

per esempio:

// 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

Un'altra importante differenza in questo contesto sarebbe con process.stdout.clearLine()e process.stdout.cursorTo(0).

Ciò sarebbe utile se si desidera mostrare la percentuale di download o elaborazione in una sola riga. Se usi clearLine (), cursoreTo () con console.log()esso non funziona perché si aggiunge anche \ n al testo. Prova questo esempio:

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

Questo è quello che sto cercando. Grazie.
Patrick P.

5

Ho appena notato qualcosa durante la ricerca di questo dopo aver ricevuto aiuto con https.request per il metodo post. Ho pensato di condividere alcuni input per aiutare a capire.

process.stdout.writenon aggiunge una nuova riga mentre lo console.logfa, come altri hanno già detto. Ma c'è anche questo che è più facile da spiegare con esempi.

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

process.stdout.write(d);stamperà i dati correttamente senza una nuova riga. Tuttavia console.log(d)stamperà una nuova riga ma i dati non verranno visualizzati correttamente, <Buffer 12 34 56...ad esempio.

Per console.log(d)mostrare correttamente le informazioni, dovrei farlo.

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

Quindi in poche parole:

  • process.stdout.write stampa continuamente le informazioni mentre i dati vengono recuperati e non aggiunge una nuova riga.

  • console.log stampa le informazioni ottenute al momento del recupero e aggiunge una nuova riga.

Questo è il modo migliore in cui posso spiegarlo.


1

La differenza semplice è: i metodi console.log () aggiungono automaticamente il carattere di nuova riga. Significa che se stiamo eseguendo il ciclo continuo e stampando il risultato, ogni risultato viene stampato in una nuova riga.

I metodi process.stdout.write () non aggiungono il carattere di nuova riga. utile per la stampa di motivi.


0

Console.log implement process.sdout.write, process.sdout.write è un buffer / flusso che verrà emesso direttamente nella tua console.

Secondo il mio puglin serverline : console = new Console(consoleOptions)puoi riscrivere la classe Console con il tuo sistema readline .

Puoi vedere l'origine del codice di console.log:


Vedi altro :

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.