javascript - ¿Diferencia entre "process.stdout.write" y "console.log" en node.js?
(6)
Acabo de notar algo al investigar esto después de obtener ayuda con https.request para el método de publicación. Pensé que comparto algunas aportaciones para ayudar a entender.
process.stdout.write
no agrega una nueva línea mientras que console.log
hace, como han mencionado otros. Pero también hay esto que es más fácil de explicar con ejemplos.
var req = https.request(options, (res) => {
res.on(''data'', (d) => {
process.stdout.write(d);
console.log(d)
});
});
process.stdout.write(d);
imprimirá los datos correctamente sin una nueva línea. Sin embargo, console.log(d)
imprimirá una nueva línea pero los datos no se mostrarán correctamente, dando a este <Buffer 12 34 56...
por ejemplo.
Para que console.log(d)
muestre la información correctamente, tendría que hacer esto.
var req = https.request(options, (res) => {
var dataQueue = "";
res.on("data", function (d) {
dataQueue += d;
});
res.on("end", function () {
console.log(dataQueue);
});
});
Así que básicamente:
process.stdout.write
imprime continuamente la información como los datos que se recuperan y no agrega una nueva línea.console.log
imprime la información obtenida en el punto de recuperación y agrega una nueva línea.
Esa es la mejor manera en que puedo explicarlo.
¿Cuál es la diferencia entre "process.stdout.write" y "console.log" en node.js?
EDITAR: el uso de console.log para una variable mostró una gran cantidad de caracteres ilegibles, mientras que el uso de process.stdout.write mostró un objeto.
¿Porqué es eso?
Mirando los documentos de Node aparentemente console.log es solo process.stdout.write con un salto de línea al final:
console.log = function (d) {
process.stdout.write(d + ''/n'');
};
Fuente: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout
Otra diferencia importante en este contexto sería con process.stdout.clearLine()
y process.stdout.cursorTo(0)
.
Esto sería útil si desea mostrar el porcentaje de descarga o procesamiento en la única línea. Si usa clearLine (), cursorTo () con console.log()
no funciona porque también agrega / n al texto. Solo prueba este ejemplo:
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);
Sé que esta es una pregunta muy antigua, pero no vi a nadie hablando de la diferencia principal entre process.stdout.write
y console.log
y solo quiero mencionarlo.
Como y TK-421 , console.log
agrega un carácter de line-break
al final de la línea ( /n
), pero eso no es todo lo que hace.
El código no ha cambiado desde al menos la versión 0.10.X
y ahora tenemos una versión 5.X
Here está el código:
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + ''/n'');
};
Como puede ver, hay una parte que dice .apply(this, arguments)
y que hace una gran diferencia en la funcionalidad. Es más fácil de explicar que con ejemplos:
process.stdout.write
tiene una funcionalidad muy básica, simplemente puedes escribir algo allí, como esto:
process.stdout.write("Hello World/n");
Si no pones la línea de ruptura al final, obtendrás un carácter extraño después de tu cadena, algo como esto:
process.stdout.write("Hello World"); //Hello World%
(Creo que significa algo como "el final del programa", por lo que lo verá solo si process.stdout.write
se usó al final de su archivo y no agregó la línea de ruptura)
Por otro lado, console.log
puede hacer más.
Puedes usarlo de la misma manera.
console.log("Hello World"); //You don''t need the break line here because it was already formated
console.log("Hello World"); //You don''t need the break line here because it was already formated
y también desapareció ese carácter extrañoPuedes escribir más de una cadena
console.log("Hello", "World");
Puedes hacer asociaciones
console.log("Hello %s", "World") //Useful when "World" is inside a variable
Y eso es todo, esa funcionalidad adicional se otorga gracias a la parte util.format.apply
(podría hablar mucho sobre lo que hace exactamente esto, pero entiendes mi punto, puedes leer más here ).
Espero que alguien encuentre útil esta información.
Una gran diferencia que no se ha mencionado es que process.stdout solo toma cadenas como argumentos (también se pueden canalizar flujos), mientras que console.log toma cualquier tipo de datos de Javascript.
p.ej:
// 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)
console.log()
llama a process.stdout.write
con una salida con formato. Ver format()
en console.js para la implementación.
Actualmente (v0.10.ish):
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + ''/n'');
};