¿Diferencia entre "process.stdout.write" y "console.log" en node.js?


323

¿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ó muchos caracteres ilegibles mientras que el proceso.stdout.write mostró un objeto.

¿Porqué es eso?


44
¿Puede dar un ejemplo? console.log () llama a process.stdout.write con salida formateada. Vea format () en console.js para la implementación.
TK-421

Respuestas:


324

console.log()llamadas process.stdout.writecon salida formateada. 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');
};

34
También vale la pena mencionar que console.log()parece agregar una nueva línea
jchook

144

Al mirar los documentos del nodo, 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


18
Para las personas que vienen más tarde, tenga en cuenta que v0.3.1 fue hace mucho tiempo y las cosas han cambiado desde entonces. :)
Brendan

55
... no Acabo de mirar v0.9.9 docs y console.log sigue siendo solo un alias para process.stdout.write con un salto de línea. Haga su investigación antes de comentar. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Mauvis Ledford

13
1) v0.9.9 tiene dos años 2) esa documentación es incorrecta, según v0.9.9 el formato se interpola a través de util
Brendan

44
En realidad, parece que esa documentación nunca se ha actualizado y todavía está disponible (¿SECA a alguien?). Enviaré un RP para arreglar eso, gracias por notificarme sobre ese problema :)
Brendan


66

Sé que esta es una pregunta muy antigua, pero no vi a nadie hablando sobre la diferencia principal entre process.stdout.writey console.logsolo quiero mencionarla.

Como señalaron Mauvis Leford y TK-421 , console.logagrega un line-breakpersonaje 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 0.10.Xversión y ahora tenemos una 5.Xversión.

Aquí 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 explicar eso con ejemplos:

process.stdout.write tiene una funcionalidad muy básica, puedes escribir algo allí, como este:

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

Si no pones la línea de ruptura al final, obtendrás un personaje extraño después de tu cadena, algo como esto:

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

(Creo que eso significa algo así como "el final del programa", por lo que lo verá solo si process.stdout.writese utilizó al final de su archivo y no agregó la línea de corte)

Por otro lado, console.logpuede hacer más.

  1. Puedes usarlo 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 adicional se da gracias a la util.format.applyparte (podría hablar mucho sobre qué hace exactamente esto, pero entiendes mi punto, puedes leer más aquí ).

Espero que alguien encuentre útil esta información.


Sería muy útil también si explicaras cómo usar stdout.writey evitar el contacto%
Muhammad Aref

Resolví el problema de llegar %al final simplemente llamando process.stdout.write('\n');al final de mi ciclo (si tienes, por ejemplo)
Muhammad Aref

2
Esta %es solo la forma en que el shell dice que no hay una nueva línea al final del archivo.
Dave Newton

1
@DaveNewton su punto es importante, porque significa que si está redirigiendo la salida de su programa a un archivo, por ejemplo, no obtendrá eso %en el archivo
mr.mams

31

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 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)

15

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()él 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);

Esto es lo que estoy buscando. Gracias.
Patrick P.

5

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 algunos aportes para ayudar a entender.

process.stdout.writeno agrega una nueva línea mientras lo console.loghace, 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, <Buffer 12 34 56...por ejemplo.

Para console.log(d)mostrar 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 a medida que se recuperan los datos y no agrega una nueva línea.

  • console.log imprime 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.


1

La diferencia simple es: los métodos console.log () añaden automáticamente un nuevo carácter de línea. Significa que si estamos recorriendo e imprimiendo el resultado, cada resultado se imprime en una nueva línea.

Los métodos process.stdout.write () no agregan un nuevo carácter de línea. útil para imprimir patrones.


0

Console.log implemente process.sdout.write, process.sdout.write es un búfer / flujo que saldrá directamente en su consola.

De acuerdo con mi línea de servidor puglin : console = new Console(consoleOptions)puede volver a escribir la clase de consola con su propio sistema de línea de lectura .

Puede ver el código fuente de console.log:


Ver más :

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.