Answers:
另外,如果要覆盖同一行中的消息(例如,在倒计时中),则可以在字符串的末尾添加“ \ r”。
process.stdout.write("Downloading " + data.length + " bytes\r");
process.stdout.write("Downloading " + data.length + " bytes\033[0G");
在Windows控制台(也是Linux)中,您应该'\r'
用其等效代码替换\033[0G
:
process.stdout.write('ok\033[0G');
这使用VT220终端转义序列将光标发送到第一列。
[\] 39
,并且光标在第一个字符上突出显示:var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
man console_codes
(Linux或在线)上找到基本的介绍,我最喜欢的参考资料是www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/…(其中99%的内容仍然有效) 。仅警告:准备广泛部署之前,准备在几个不同的终端上测试任何实验。
为了扩展/增强上述@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
在下一个打印语句的前面放置光标,将在替换字符串覆盖前一个字符串之前重置光标。
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");
});
util.print
现在已弃用
(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
似乎有许多答案表明:
process.stdout.write
错误日志应发布在:
process.stderr
而是使用:
console.error
对于任何想知道为什么process.stdout.write('\033[0G');
不执行任何操作的人,因为它stdout
被缓冲了,您需要等待drain
事件(更多信息)。
如果写返回false
,将触发一个drain
事件。
使用严格模式时出现以下错误:
节点错误:“严格模式下不允许使用八进制文字。”
以下解决方案有效(来源):
process.stdout.write("received: " + bytesReceived + "\x1B[0G");
console.log
在打印时\n
从字面上时,我想它打印一个换行符。