javascript - Diferencia entre "process.stdout.write" y "console.log" en node.js?
¿Cuál es la diferencia entre "process.stdout.write" y "console.log" en node.js?
EDITAR: Usar console.log para una variable mostró muchos caracteres ilegibles mientras que usar process.stdout.write mostró un objeto.
¿Por qué es eso?
Respuesta #1
console.log() llama a process.stdout.write con salida formateada. Vea format() en console.js para la implementación.
Actualmente (v0.10.aproximadamente):
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
Respuesta #2
Observando la documentación 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
Respuesta #3
Sé que esta es una pregunta muy antigua, pero no vi a nadie hablando sobre la principal diferencia entre process.stdout.write y console.log y solo quiero mencionarlo.
Como señalaron Mauvis Leford y TK-421, el console.log agrega un carácter de salto de línea 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.
Aquí está el código:
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
Como puedes ver, hay una parte que dice .apply(this, arguments) y eso marca una gran diferencia en la funcionalidad. Es más fácil explicarlo con ejemplos:
process.stdout.write tiene una funcionalidad muy básica, solo puedes escribir algo allí, así:
process.stdout.write("Hello World\n");
Si no pones el salto de línea al final, obtendrás un carácter extraño después de tu cadena, algo así:
process.stdout.write("Hello World"); //Hello World%
(Creo que eso significa algo como "el fin del programa", así que solo lo verás si se usó process.stdout.write al final de tu archivo y no agregaste la línea de salto)
Por otro lado, console.log puede hacer más.
Puedes usarlo de la misma manera
console.log("Hola Mundo"); //No necesitas la línea de interrupción aquí porque ya estaba formateaday también ese carácter extraño desaparecióPuedes 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 añadida se debe a la parte util.format.apply (podría hablar mucho sobre lo que exactamente hace esto, pero entiendes mi punto, puedes leer más aquí).
Espero que alguien encuentre útil esta información.
Respuesta #4
Una gran diferencia que no se ha mencionado es que process.stdout solo acepta cadenas como argumentos (también se pueden usar flujos canalizados), mientras que console.log acepta cualquier tipo de dato 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)
Respuesta #5
Otra diferencia importante en este contexto sería con process.stdout.clearLine() y process.stdout.cursorTo(0).
Esto sería útil si quieres mostrar el porcentaje de descarga o procesamiento en una sola línea. Si usas clearLine(), cursorTo() con console.log() no funciona porque también añade \n al texto. Solo prueba este ejemplo:
var totalTime = 5000;
var waitInterval = totalTime / 10;
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 + 100)
Respuesta #6
Acabo de notar algo mientras investigaba esto después de recibir ayuda con https.request para el método POST. Pensé en compartir algunas ideas para ayudar a entender.
process.stdout.write no agrega una nueva línea mientras que console.log sí lo hace, como otros habían mencionado. Pero también está 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 esto <Buffer 12 34 56... por ejemplo.
Para hacer 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.writeimprime continuamente la información a medida que se recuperan los datos y no agrega una nueva línea.console.logimprime la información que se obtuvo en el punto de recuperación y agrega una nueva línea.
Esa es la mejor manera en que puedo explicarlo.
