Node.js: printing to console without a trailing newline?

主宰稳场 提交于 2019-11-26 21:13:37
onteria_

You can use process.stdout.write():

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

See the docs for details.

Also, if you want to overwrite messages in the same line, for instance in a countdown, you could add '\r' at the end of the string.

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

In Windows console (Linux, too), you should replace '\r' with its equivalent code \033[0G:

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

This uses a VT220 terminal escape sequence to send the cursor to the first column.

As an expansion/enhancement to the brilliant addition made by @rodowi above regarding being able to overwrite a row:

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

Should you not want the terminal cursor to be located at the first character, as I saw in my code, the consider doing the following:

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)

By placing the \r in front of the next print statement the cursor is reset just before the replacing string overwrites the previous.

util.print can be used also. Read: http://nodejs.org/api/util.html#util_util_print

util.print([...])# A synchronous output function. Will block the process, cast each argument to a string then output to stdout. Does not place newlines after each argument.

An example:

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

There seem to be many answers suggesting process.stdout.write. Error logs should be emitted on process.stderr instead (Use console.error). For anyone who is wonder why process.stdout.write('\033[0G'); wasn't doing anything it's because stdout is buffered and you need to wait for drain event (See Stdout flush for NodeJS?). If write returns false it will fire a drain event.

None of these solutions work for me. process.stdout.write('ok\033[0G') and just using '\r' just create a new line, do not overwrite, Mac OSX 10.9.2

EDIT: I had to use this to replace the current line

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

I got an error when using strict mode.

Node error: "Octal literals are not allowed in strict mode."

I found the answer here: https://github.com/SBoudrias/Inquirer.js/issues/111

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!