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

时间:2011-05-27 20:42:34

标签: node.js console console.log

是否有一种方法可以在没有尾随换行符的情况下打印到控制台? console对象documentation没有提及任何相关内容:

  

console.log()

     

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

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

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

8 个答案:

答案 0 :(得分:902)

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

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

请参阅docs for details

答案 1 :(得分:339)

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

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

答案 2 :(得分:17)

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

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

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

答案 3 :(得分:13)

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");
});

答案 4 :(得分:13)

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

答案 5 :(得分:9)

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

答案 6 :(得分:4)

使用严格模式时出错。

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

我在这里找到答案: https://github.com/SBoudrias/Inquirer.js/issues/111

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

答案 7 :(得分:3)

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

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

process.stdout.write( '\ 033 [0G'); process.stdout.write( 'Newstuff文件');