Diferença entre "process.stdout.write" e "console.log" no node.js?

323

Qual é a diferença entre "process.stdout.write" e "console.log" no node.js?

EDIT: O uso do console.log para uma variável mostrou muitos caracteres ilegíveis enquanto o processo.stdout.write mostrou um objeto.

Por que é que?

ajsie
fonte
4
você pode dar um exemplo? console.log () chama process.stdout.write com saída formatada. Veja format () em console.js para a implementação.
TK-421

Respostas:

324

console.log()chamadas process.stdout.writecom saída formatada. Veja format()no console.js a implementação.

Atualmente (v0.10.ish):

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};
TK-421
fonte
34
Também vale a pena mencionar que console.log()aparece para adicionar uma nova linha
jchook
144

Olhando para os documentos do Nó, aparentemente console.log é apenas process.stdout.write com uma quebra de linha no final:

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

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

Mauvis Ledford
fonte
18
Para as pessoas que aparecerão mais tarde, observe que a v0.3.1 foi há muito tempo e as coisas mudaram desde então. :)
Brendan
5
...Não. Vimos os documentos v0.9.9 e console.log ainda é apenas um alias para processar.stdout.write com uma quebra de linha. Por favor, faça sua pesquisa antes de comentar. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford
13
1) v0.9.9 tem dois anos 2) que a documentação está incorreta, conforme v0.9.9 o formato é interpolado através do utilitário
Brendan
4
Na verdade, parece que essa documentação nunca foi atualizada e ainda está por aí (DRY alguém?). Eu vou estar enviando um PR de corrigir isso, obrigado por notificando-me dessa questão :)
Brendan
66

Sei que essa é uma pergunta muito antiga, mas não vi ninguém falando sobre a principal diferença entre process.stdout.writee console.loge só quero mencioná-la.

Como Mauvis Leford e TK-421 apontaram, o personagem console.logadiciona um line-breakcaractere no final da linha ( \n), mas isso não é tudo o que faz.

O código não mudou desde pelo menos a 0.10.Xversão e agora temos uma 5.Xversão.

Aqui está o código:

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

Como você pode ver, há uma parte que diz .apply(this, arguments)e faz uma grande diferença na funcionalidade. É mais fácil explicar isso com exemplos:

process.stdout.write tem uma funcionalidade muito básica, você pode simplesmente escrever algo lá, assim:

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

Se você não colocar a linha de interrupção no final, obterá um caractere estranho após a string, algo como isto:

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

(Eu acho que isso significa algo como "o final do programa", então você o verá apenas se você tiver process.stdout.writesido usado no final do seu arquivo e não tiver adicionado a linha de interrupção)

Por outro lado, console.logpode fazer mais.

  1. Você pode usá-lo da mesma maneira

    console.log("Hello World"); //You don't need the break line here because it was already formated e também esse personagem estranho desapareceu

  2. Você pode escrever mais de uma string

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

  3. Você pode fazer associações

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

E é isso, essa funcionalidade adicional é dada graças à util.format.applyparte (eu poderia falar muito sobre o que exatamente isso faz, mas você entende meu ponto, pode ler mais aqui ).

Espero que alguém ache essa informação útil.

Gepser
fonte
Seria muito útil também se você explicasse como usar stdout.writee evitar o uso de # #%
Muhammad Aref
Eu resolvi o problema de obter %no final simplesmente chamando process.stdout.write('\n');no final do meu loop (se tiver por exemplo)
Muhammad Aref
2
Essa %é apenas a maneira do shell dizer que não há nova linha no final do arquivo.
Dave Newton
1
@DaveNewton seu ponto é importante, porque significa que se você estiver redirecionando a saída do seu programa para um arquivo, por exemplo, você não o encontrará %no arquivo
mr.mams
31

Uma grande diferença que não foi mencionada é que process.stdout usa apenas strings como argumentos (também podem ser fluxos de canal), enquanto console.log usa qualquer tipo de dados Javascript.

por exemplo:

// 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)
thelostspore
fonte
15

Outra diferença importante nesse contexto seria com process.stdout.clearLine()e process.stdout.cursorTo(0).

Isso seria útil se você deseja mostrar a porcentagem de download ou processamento na única linha. Se você usar clearLine (), cursorTo () com console.log()ele não funcionará, porque também anexará \ n ao texto. Apenas tente este exemplo:

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);
saikirann
fonte
É isso que estou procurando. Obrigado.
Patrick P.
5

Acabei de perceber algo ao pesquisar isso depois de obter ajuda com https.request para o método post. Pensei em compartilhar algumas informações para ajudar a entender.

process.stdout.writenão adiciona uma nova linha enquanto adiciona console.log, como outros mencionaram. Mas há também isso que é mais fácil de explicar com exemplos.

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

process.stdout.write(d);imprimirá os dados corretamente sem uma nova linha. No entanto console.log(d), imprimirá uma nova linha, mas os dados não serão exibidos corretamente, fornecendo isso, <Buffer 12 34 56...por exemplo.

Para fazer console.log(d)mostrar as informações corretamente, eu teria que fazer isso.

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

Então, basicamente:

  • process.stdout.write imprime continuamente as informações como os dados sendo recuperados e não adiciona uma nova linha.

  • console.log imprime as informações obtidas no ponto de recuperação e adiciona uma nova linha.

Essa é a melhor maneira de explicar.

Nova
fonte
1

A diferença simples é: os métodos console.log () acrescentam automaticamente o novo caractere de linha. Isso significa que, se estivermos repetindo e imprimindo o resultado, cada resultado será impresso em uma nova linha.

Os métodos process.stdout.write () não acrescentam novos caracteres de linha. útil para imprimir padrões.

Rishu Anand
fonte
0

O console.log implementa process.sdout.write, process.sdout.write é um buffer / fluxo que será gerado diretamente no console.

De acordo com a minha puglin serverline : console = new Console(consoleOptions)você pode reescrever classe Console com seu próprio readline sistema.

Você pode ver a fonte de código do console.log:


Ver mais :

A-312
fonte