Node.js:打印到控制台没有尾随换行符?

Eva*_*oll 624 console node.js console.log

是否有一种方法可以在没有尾随换行符的情况下打印到控制台?该console对象的文档并没有说关于任何东西:

console.log()

用换行符打印到stdout.此函数可以采用类似printf()方式的多个参数.例:

console.log('count: %d', count);
Run Code Online (Sandbox Code Playgroud)

如果在第一个字符串中找不到格式化元素,则util.inspect在每个参数上使用.

ont*_*ia_ 966

你可以使用process.stdout.write():

process.stdout.write("hello: ");
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅文档.

  • 这解决了我的相反问题.当我希望它打印换行符时,`console.log`字面打印`\n`. (7认同)
  • @AlexMills它是换行符的转义序列,但它本身不是换行符.当我想输出一个真正的换行符时,我得到一个文字`\`后跟一个'n`. (3认同)
  • @Paulpro 不是 '\n' 换行符吗? (2认同)
  • 在 Node.js 上打印 `hello: true` (2认同)

def*_*vol 358

此外,如果要覆盖同一行中的消息,例如在倒计时中,可以在字符串末尾添加"\ r".

process.stdout.write("Downloading " + data.length + " bytes\r");
Run Code Online (Sandbox Code Playgroud)

  • 对于Windows,您可以使用等效代码'\ 033 [0G',如:`process.stdout.write("Downloading"+ data.length +"bytes\033 [0G");` (43认同)
  • 要使@GarciadelCastillo的评论中的[ansi转义码](https://en.wikipedia.org/wiki/ANSI_escape_code)在严格模式下工作,请将八进制文字`\ 033`替换为十六进制文字`\x1b`像这样:`\ x1b [0G`.(适用于严格和非严格的代码) (18认同)
  • 虽然不是问题的答案,但这是一个惊人的答案.迫不及待地想试试. (17认同)
  • 这对我来说不适用于Windows.但在非dows上效果很好. (7认同)
  • 只需将\ r放在字符串的开头而不是字符串的末尾,以使其在Windows中正常工作. (6认同)
  • 这很好,但是您如何首先清楚行的内容?`.write("goodbye\r")` 后跟 `.write("hi\r")` 结果为 `hiodbye` (2认同)
  • 这对我不起作用。我使用:`process.stdout.clearLine(); process.stdout.cursorTo(0);`。我不确定使用回车符是否是一种黑客行为,但是 [`clearLine()`](https://nodejs.org/dist/latest-v15.x/docs/api/tty.html#tty_writestream_clearline_dir_callback) 和在 [node.js 文档](https://nodejs .org/en/docs/) (2认同)

小智 18

在Windows控制台(也是Linux)中,您应该将'\ _ \'替换为等效代码\ 033 [0G:

process.stdout.write('ok\033[0G');
Run Code Online (Sandbox Code Playgroud)

这使用VT220终端转义序列将光标发送到第一列.

  • 您将如何返回多行而不是仅返回当前行?*top* 程序似乎能够在它运行时覆盖我的整个缓冲区,并在它完成时恢复那里的内容。有谁知道它是如何做到的?http://i.imgur.com/AtCmEjn.gif (2认同)
  • @Chev:由于他们自己的 FUD,大多数人会劝阻您不要使用硬编码的转义序列,但现在几乎每个人都使用 VT100,因此兼容性不再是真正的问题。您所指的功能是“备用屏幕”行为。基本介绍可以在`man console_codes`(Linux 或在线)中找到,我最喜欢的参考是 http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/HTML/ MAN/MAN5/0036____.HTM(其 99% 的内容仍然有效)。唯一警告:在广泛部署之前,准备好在几个不同的终端上测试任何实验。 (2认同)

mra*_*xus 17

作为@rodowi上面关于能够覆盖一行的精彩内容的扩展/增强:

process.stdout.write("Downloading " + data.length + " bytes\r");
Run Code Online (Sandbox Code Playgroud)

如果我不希望终端光标位于第一个字符,正如我在代码中看到的那样,请考虑执行以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

通过放置\r在下一个print语句的前面,光标在替换字符串覆盖前一个字符串之前被重置.


dou*_*uyw 13

util.print也可以使用.阅读:http://nodejs.org/api/util.html#util_util_print

util.print([...])#A同步输出功能.将阻塞进程,将每个参数转换为字符串,然后输出到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");
});
Run Code Online (Sandbox Code Playgroud)

  • `util.print`现已弃用 (39认同)

Ahm*_*sud 9

似乎有许多答案表明process.stdout.write('\033[0G');.应该发出错误日志stdout(使用drain).对于任何想知道为什么process.stdout.write('\ 033 [0G'); 没有做任何事情,因为stdout是缓冲的,你需要等待false事件(参见NodeJS的Stdout flush?).如果write返回false,它将触发一个drain事件.

  • 问题和任何答案都没有解决错误日志...... (10认同)

Tyg*_*uy7 5

这些解决方案都不适合我,process.stdout.write('ok\033[0G')只是'\r'在 Mac OSX 10.9.2 上创建一个新行但不要覆盖。

编辑: 我不得不用它来替换当前行:

process.stdout.write('\033[0G');
process.stdout.write('newstuff');
Run Code Online (Sandbox Code Playgroud)


bla*_*bla 5

使用严格模式时出现以下错误:

节点错误:“严格模式下不允许使用八进制文字。”

以下解决方案有效(来源):

process.stdout.write("received: " + bytesReceived + "\x1B[0G");
Run Code Online (Sandbox Code Playgroud)