是否有一种方法可以在没有尾随换行符的情况下打印到控制台? console
对象documentation没有提及任何相关内容:
console.log()
使用换行符打印到stdout。此函数可以采用
printf()
类似的方式获取多个参数。例如:console.log('count: %d', count);
如果在第一个字符串中找不到格式化元素,则每个参数都使用
util.inspect
。
答案 0 :(得分:902)
答案 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文件');