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?
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?
Respostas:
console.log()
chamadas process.stdout.write
com 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');
};
console.log()
aparece para adicionar uma nova linha
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
Sei que essa é uma pergunta muito antiga, mas não vi ninguém falando sobre a principal diferença entre process.stdout.write
e console.log
e só quero mencioná-la.
Como Mauvis Leford e TK-421 apontaram, o personagem console.log
adiciona um line-break
caractere 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.X
versão e agora temos uma 5.X
versã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.write
sido usado no final do seu arquivo e não tiver adicionado a linha de interrupção)
Por outro lado, console.log
pode fazer mais.
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
Você pode escrever mais de uma string
console.log("Hello", "World");
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.apply
parte (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.
stdout.write
e evitar o uso de # #%
%
no final simplesmente chamando process.stdout.write('\n');
no final do meu loop (se tiver por exemplo)
%
é apenas a maneira do shell dizer que não há nova linha no final do arquivo.
%
no arquivo
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)
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);
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.write
nã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.
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.
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 :