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.

Evan Carroll
fuente

Respuestas:

1057

Puedes usar process.stdout.write():

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

Ver los documentos para más detalles .

onteria_
fuente
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");
defvol
fuente
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.

Yan Te
fuente
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.

mraxus
fuente
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");
});
douyw
fuente
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.

Ahmed Masud
fuente
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');
Tyguy7
fuente
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");
bla bla bla
fuente
Cambie el formato literal numérico ocular tobsone.orher
FrancescoMM