Node.js: ¿imprime en la consola sin una nueva línea final?


682

¿Existe algún método para imprimir en la consola sin una nueva línea final? La documentación delconsole objeto no dice nada al respecto:

console.log()

Imprime en stdout con nueva línea. Esta función puede tomar múltiples argumentos de forma printf()similar. Ejemplo:

console.log('count: %d', count);

Si no se encuentran elementos formateados en la primera cadena, entonces util.inspectse usa en cada argumento.

Respuestas:


1057

Puedes usar process.stdout.write():

process.stdout.write("hello: ");

Ver los documentos para más detalles .


77
Esto resolvió el problema opuesto para mí. console.logestaba imprimiendo \nliteralmente cuando quería que imprimiera un personaje de nueva línea.
Paul

@Paulpro no es '\ n' el personaje de nueva línea?
Alexander Mills

3
@AlexMills Es la secuencia de escape para un personaje de nueva línea, pero no es un personaje de nueva línea en sí. Estaba obteniendo un n literal ` followed by an , cuando quería generar un carácter real de nueva línea.
Paul

378

Además, si desea sobrescribir mensajes en la misma línea, por ejemplo, en una cuenta regresiva, puede agregar '\ r' al final de la cadena.

process.stdout.write("Downloading " + data.length + " bytes\r");

18
Aunque no es la respuesta a la pregunta, esta es una respuesta sorprendente. No puedo esperar para intentarlo.
longda

8
Esto no funciona en Windows para mí. Pero funciona muy bien en no-dows.
chowey

45
Para Windows, puede usar el código equivalente '\ 033 [0G', como en:process.stdout.write("Downloading " + data.length + " bytes\033[0G");
GarciadelCastillo

19
Para hacer que el código de escape ANSI dado anteriormente en un comentario por @GarciadelCastillo a trabajar en modo estricto, reemplazar el literal octal \033con el literal hexagonal de \x1bla siguiente manera: \x1b[0G. (que funciona con código estricto y no estricto)
algunos

77
Simplemente coloque el \ r al principio en lugar de al final de la cadena para que funcione en Windows.
daremkd

20

En la consola de Windows (también en Linux), debe reemplazarlo '\r'con su código equivalente \033[0G:

process.stdout.write('ok\033[0G');

Esto utiliza una secuencia de escape de terminal VT220 para enviar el cursor a la primera columna.


1
¿Cómo volvería a subir varias líneas en lugar de solo la línea actual? El programa superior parece ser capaz de anular todo mi búfer mientras se está ejecutando y restaura lo que estaba allí cuando se hace. Alguien sabe cómo hace esto? i.imgur.com/AtCmEjn.gif
Chev

Creo que probablemente usa algo como uno de estos: github.com/mscdex/node-ncurses github.com/chjj/blessed
Brandon el

1
Funciona pero también obtengo el cursor [\] 39y el cursor se resalta en el primer carácter:var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
loretoparisi

1
@Chev Top es especial, no es algo que pueda escribir con códigos de escape ANSI. De hecho, usa ncurses, por lo que no lo encontrará en sistemas embebidos que no tienen grandes bibliotecas C
cat

1
@Chev: la mayoría de las personas te disuadirá de jugar con secuencias de escape codificadas debido a su propio FUD, pero casi todos usan VT100 ahora, por lo que la compatibilidad ya no es un problema. La funcionalidad a la que se refiere es el comportamiento de "pantalla alternativa". Se puede encontrar una introducción básica en man console_codes(en Linux o en línea) y mi referencia favorita es www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/… (99% de su contenido aún funciona) . Solo advertencia: esté preparado para probar cualquier experimento en varias terminales diferentes antes de desplegarlo ampliamente.
i336_

18

Como una expansión / mejora de la brillante adición realizada por @rodowi anteriormente con respecto a poder sobrescribir una fila:

process.stdout.write("Downloading " + data.length + " bytes\r");

Si no desea que el cursor del terminal se ubique en el primer carácter, como vi en mi código, considere hacer lo siguiente:

let dots = ''
process.stdout.write(`Loading `)

let tmrID = setInterval(() => {
  dots += '.'
  process.stdout.write(`\rLoading ${dots}`)
}, 1000)

setTimeout(() => {
  clearInterval(tmrID)
  console.log(`\rLoaded in [3500 ms]`)
}, 3500)

Al colocar \rdelante de la siguiente declaración de impresión, el cursor se restablece justo antes de que la cadena de reemplazo sobrescriba la anterior.


13

util.print también se puede usar. Leer: http://nodejs.org/api/util.html#util_util_print

util.print ([...]) # Una función de salida síncrona. Bloqueará el proceso, convertirá cada argumento en una cadena y luego lo enviará a stdout. No coloca nuevas líneas después de cada argumento.

Un ejemplo:

// get total length
var len = parseInt(response.headers['content-length'], 10);
var cur = 0;

// handle the response
response.on('data', function(chunk) {
  cur += chunk.length;
  util.print("Downloading " + (100.0 * cur / len).toFixed(2) + "% " + cur + " bytes\r");
});

39
util.printestá en desuso ahora
Petr Peller

(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
Verde

10

Parece que hay muchas respuestas que sugieren:

process.stdout.write

Los registros de errores deben emitirse en:

process.stderr

En su lugar use:

console.error

Para cualquiera que se pregunte por qué process.stdout.write('\033[0G');no estaba haciendo nada, es porque stdoutestá protegido y necesita esperardrain evento ( más información ).

Si la escritura devuelve, falsese activará un drainevento.


4

Ninguna de estas soluciones funciona para mí, process.stdout.write('ok\033[0G')y solo uso'\r' crear una nueva línea pero no sobrescribir en Mac OSX 10.9.2.

EDITAR: tuve que usar esto para reemplazar la línea actual:

process.stdout.write('\033[0G');
process.stdout.write('newstuff');

4

Recibí el siguiente error cuando uso el modo estricto:

Error de nodo: "Los literales octales no están permitidos en modo estricto".

La siguiente solución funciona ( fuente ):

process.stdout.write("received: " + bytesReceived + "\x1B[0G");

Cambie el formato literal numérico ocular tobsone.orher
FrancescoMM
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.