Diferencia entre "proceso".stdout.escribe " y " consola.log" en el nodo.js?


¿Cuál es la diferencia entre " proceso.stdout.escribe " y " consola.log" en el nodo.js?

EDITAR: Usando la consola.el registro de una variable mostró una gran cantidad de caracteres ilegibles durante el uso de proceso.stdout.write mostró un objeto.

¿Por qué es eso?

Author: MPelletier, 2011-02-12

6 answers

console.log() llama process.stdout.write con salida formateada. Ver format() en la consola.js para la implementación.

Actualmente (v0.10.ish):

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};
 211
Author: TK-421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-15 15:08:01

Mirando el nodo docs aparentemente consola.el registro es solo un proceso.stdout.escribe 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

 112
Author: Mauvis Ledford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-26 20:40:40

Sé que esta es una pregunta muy antigua, pero no vi a nadie hablando de la principal diferencia entre process.stdout.write y console.log y solo quiero mencionarla.

Como Mauvis Leford y TK-421 señalaron, el console.log agrega un carácter 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.

Aquí es 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 que hace una gran diferencia en la funcionalidad. Es más fácil explicar eso con ejemplos:

process.stdout.write tiene una funcionalidad muy básica, puedes escribir algo ahí, 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 así: {[19]]}

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

(Creo que eso significa algo como "el fin del programa", así que lo verá solo si process.stdout.write se usó al final de su archivo y no agregó la línea de interrupción)

Por otro lado, console.log puede hacer más.

  1. Se puede utilizar de la misma manera

    console.log("Hello World"); //You don't need the break line here because it was already formated y también ese extraño personaje desapareció

  2. Puedes escribir más de una cadena

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

  3. Puedes hacer asociaciones

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

Y eso es todo, esa funcionalidad añadida es dado gracias a la parte util.format.apply (podría hablar mucho sobre qué hace exactamente esto, pero entiendes mi punto, puedes leer más aquí).

Espero que alguien encuentre esta información útil.

 44
Author: Gepser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:31

Una gran diferencia que no se ha mencionado es que proceso.stdout solo toma cadenas como argumentos (también pueden ser flujos canalizados), mientras que console.log toma cualquier tipo de datos Javascript.

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)
 22
Author: thelostspore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 05:59:44

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 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 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);
 7
Author: saikirann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-15 17:40:26

Acabo de notar algo mientras investigaba esto después de obtener ayuda con https.solicitud de método post. Pensé que compartía algunas ideas para ayudar a entender.

process.stdout.write no agrega una nueva línea mientras que console.log lo hace, como otros habían mencionado. 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 esto <Buffer 12 34 56... para 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.write imprime continuamente la información como los datos que se están recuperando y no agrega una nueva línea.

  • console.log imprime la información obtenida en el punto de recuperación y añade una nueva línea.

Esa es la mejor manera en que puedo explicarlo.

 2
Author: Nova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-11 01:15:45