Evan Carroll
Evan Carroll

Reputation: 1

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

Is there a method for printing to the console without a trailing newline? The console object documentation doesn't say anything regarding that:

console.log()

Prints to stdout with newline. This function can take multiple arguments in a printf()-like way. Example:

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

If formating elements are not found in the first string then util.inspect is used on each argument.

Upvotes: 949

Views: 584053

Answers (10)

Roman
Roman

Reputation: 21845

My environment MacBook pro. I use Terminal. Nothing works for me.

Credit to @shennan:

If your use-case involves attempting to log perpetually changing data while avoiding console-bloat, then one way to achieve this (in certain browsers) would be to use console.clear() before each output.

  console.clear();
  console.log(msg);

Upvotes: 0

If you want that to work both in Linux and Windows, strict mode and non strict mode, and to completely clear the line every time you print, you can use

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

Upvotes: 3

defvol
defvol

Reputation: 15480

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

Upvotes: 531

Yan Te
Yan Te

Reputation: 429

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.

Upvotes: 32

Ahmed Masud
Ahmed Masud

Reputation: 22402

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 (more info).

If write returns false it will fire a drain event.

Upvotes: 21

blablabla
blablabla

Reputation: 1478

I got the following error when using strict mode:

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

The following solution works (source):

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

Upvotes: 5

Tyguy7
Tyguy7

Reputation: 593

None of these solutions work for me, process.stdout.write('ok\033[0G') and just using '\r' just create a new line but don't overwrite on 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');

Upvotes: 8

mraxus
mraxus

Reputation: 1443

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.

Upvotes: 44

onteria_
onteria_

Reputation: 70577

You can use process.stdout.write():

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

See the docs for details.

Upvotes: 1450

douyw
douyw

Reputation: 4074

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

Upvotes: 12

Related Questions