Node.js: печать на консоль без завершающей строки? - PullRequest
592 голосов
/ 28 мая 2011

Есть ли способ печати на консоли без завершающей строки? console объект документация ничего не говорит об этом:

console.log()

Печать на стандартный вывод с символом новой строки. Эта функция может принимать несколько аргументов в стиле printf(). Пример:

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

Если форматирующие элементы не найдены в первой строке, тогда для каждого аргумента используется util.inspect.

Ответы [ 8 ]

919 голосов
/ 28 мая 2011

Вы можете использовать process.stdout.write():

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

Подробнее см. Документы .

343 голосов
/ 09 марта 2012

Кроме того, если вы хотите перезаписать сообщения в той же строке, например в обратном отсчете, вы можете добавить '\ r' в конце строки.

process.stdout.write("Downloading " + data.length + " bytes\r");
18 голосов
/ 28 января 2014

В консоли Windows (и в Linux) вы должны заменить '\ r' эквивалентным кодом \ 033 [0G :

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

Используется escape-последовательность терминала VT220 для отправки курсора в первый столбец.

13 голосов
/ 27 декабря 2017

В качестве расширения / улучшения блестящего дополнения, сделанного @rodowi выше относительно возможности перезаписи строки:

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

Если вы не хотите, чтобы курсор терминала находился на первом символе, как я видел в своем коде, рассмотрите возможность сделать следующее:

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)

Помещая \r перед следующим оператором печати, курсор сбрасывается непосредственно перед тем, как замещающая строка перезаписывает предыдущую.

13 голосов
/ 15 ноября 2012

util.print также может использоваться.Читать: http://nodejs.org/api/util.html#util_util_print

util.print ([...]) # Функция синхронного вывода.Блокирует процесс, приводит каждый аргумент к строке, а затем выводит в stdout.Не ставит символы новой строки после каждого аргумента.

Пример:

// 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");
});
9 голосов
/ 18 августа 2015

Кажется, есть много ответов, предлагающих process.stdout.write. Вместо этого журналы ошибок должны отправляться на process.stderr (используйте console.error). Для тех, кто интересуется, почему process.stdout.write ('\ 033 [0G'); ничего не делал, это потому что stdout буферизован и вам нужно ждать события drain (см. Stdout flush для NodeJS? ). Если write возвращает false, это вызовет событие drain.

4 голосов
/ 30 сентября 2014

Я получил ошибку при использовании строгого режима.

Ошибка узла: "Восьмеричные литералы не допускаются в строгом режиме."

Я нашел ответ здесь: https://github.com/SBoudrias/Inquirer.js/issues/111

process.stdout.write ("полученный:" + bytesReceived + "\ x1B [0G");

4 голосов
/ 04 апреля 2014

Ни одно из этих решений не работает для меня.process.stdout.write ('ok \ 033 [0G') и просто с помощью '\ r' просто создайте новую строку, не перезаписывайте, Mac OSX 10.9.2

РЕДАКТИРОВАТЬ: мне пришлось использовать это длязаменить текущую строку

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

...