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.
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");
process.stdout.write("Downloading " + data.length + " bytes\033[0G");
\033
with the hex literal \x1b
like this: \x1b[0G
. (that works with both strict and non-strict code)
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.
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.
[\] 39
and the cursor is highlighted on the first char: var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
man console_codes
(on Linux or online) and my favorite reference is www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/… (99% of its contents still work). Only caveat: Be prepared to test any experiments on several different terminals before deploying widely.
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.
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");
});
util.print
is deprecated now
(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
TypeError: util.print is not a function
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');
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");
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')
Success story sharing
console.log
was printing\n
literally when I wanted it to print a newline character.` followed by an
n`, when I wanted to output a real newline character.hello: true