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

有没有一种方法可以在没有尾随换行符的情况下打印到控制台?console对象留档对此没有任何说明:

console.log()

使用换行符打印到标准输出。此函数可以以类似printf()的方式接受多个参数。示例:

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

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

491137 次浏览

您可以使用process.stdout.write()

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

详情文档

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

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

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

util.print([…])#同步输出函数。将阻止该过程,将每个参数转换为字符串,然后输出到stdout。不会在每个参数后放置换行符。

举个例子:

// get total lengthvar len = parseInt(response.headers['content-length'], 10);var cur = 0;
// handle the responseresponse.on('data', function(chunk) {cur += chunk.length;util.print("Downloading " + (100.0 * cur / len).toFixed(2) + "% " + cur + " bytes\r");});

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

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

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

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

编辑:我必须使用它来替换当前行:

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

我在使用严格模式时遇到以下错误:

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

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

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

似乎有许多答案表明:

process.stdout.write

错误日志应在以下位置发出:

process.stderr

而是使用:

console.error

对于任何想知道为什么process.stdout.write('\033[0G');没有做任何事情的人来说,这是因为stdout被缓冲了,你需要等待drain事件(更多信息)。

如果写返回false,它将触发drain事件。

作为对上面@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放在下一个print语句的前面,光标会在替换字符串覆盖前一个字符串之前重置。

如果您希望在Linux和Windows、严格模式和非严格模式下都能工作,并且每次打印时都能完全清除行,您可以使用

const str = 'Hi there'process.stdout.write(str.padEnd(50) + '\x1b[0G')