2011-02-12 20 views
185

¿Cuál es la diferencia entre "process.stdout.write" y "console.log" en node.js?Diferencia entre "process.stdout.write" y "console.log" en node.js?

EDITAR: Usar console.log para una variable mostró una gran cantidad de caracteres ilegibles durante el uso de process.stdout.write mostró un objeto.

¿Por qué es eso?

+3

¿Puedes dar un ejemplo? console.log() llama a process.stdout.write con salida formateada. Vea format() en console.js para la implementación. –

+1

Póngalo como respuesta =) – ajsie

Respuesta

176

console.log() llamadas process.stdout.write con 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'); 
}; 
107

En cuanto a los documentos de nodo parecer console.log se acaba 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

+9

Para la gente que viene más tarde, tenga en cuenta que v0.3.1 fue hace mucho tiempo y las cosas han cambiado desde entonces. :) –

+4

... no. Acabo de mirar los documentos v0.9.9 y console.log sigue siendo solo un alias para procesar.stdout.write con un salto de línea. Por favor investigue antes de comentar. http://nodejs.org/docs/v0.9.9/api/process.html#process.stdout –

+10

1) v0.9.9 tiene dos años de antigüedad 2) que la documentación es incorrecta, [según v0.9.9 el formato se interpola a través de la utilidad] (https://github.com/joyent/node/blob/v0.9.9-release/lib/console.js#L52) –

38

sé que esto es una pregunta muy antiguo, pero no vi a nadie hablando de la diferencia principal entre process.stdout.write y console.log y yo solo quiero que me nción.

Como Mauvis Leford y TK-421 señalado, la console.log añade 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 0.10.X y ahora tenemos una versión de 5.X.

Here es el código:

Console.prototype.log = function() { 
    this._stdout.write(util.format.apply(this, arguments) + '\n'); 
}; 

Como se 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, puede simplemente escribir algo allí, así:

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

Si usted no pone la línea de ruptura en el extremo obtendrá un personaje extraño después de su cuerda, algo como esto:

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

(creo que significa algo así como "el fin del programa", por lo que verá sólo si process.stdout.write se utilizó en el final de su archivo y no lo hizo t agregar la línea de salto)

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 que el carácter extraño desapareció

  2. Puede escribir más de una cadena

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

  3. Usted puede hacer asociaciones

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

Una eso es todo, que añade funcionalidad se da gracias a la parte util.format.apply (que podría hablar mucho acerca de qué es exactamente lo que esto hace, pero usted consigue mi punto, se puede leer más here).

Espero que alguien encuentre esta información útil.

+0

Sería muy útil también si explicaras cómo usar 'stdout.write' y evitaras obtener'% ' –

+0

Resolví el problema de obtener'% 'al final simplemente llamando' process.stdout.write ('\ n '); 'al final de mi ciclo (si tiene, por ejemplo) –

17

Una gran diferencia que no se ha mencionado es que process.stdout solo toma cadenas como argumentos (también se pueden transmitir por cañería), mientras que console.log toma cualquier tipo de datos de Javascript.

por ejemplo:

// 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) 
+0

Diferencia muy grande e importante. ¡Gracias! – chriskelly

1

he di cuenta de algo, mientras que la investigación de este después de conseguir ayuda con https.request para el método de entrada. Pensé en compartir algunos comentarios para ayudar a entender.

process.stdout.write no agrega una nueva línea mientras console.log lo hace, como otros habían mencionado. Pero también hay algo 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); se imprimirán 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, por ejemplo, <Buffer 12 34 56....

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 que los datos sean recuperados y no añade 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.

2

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