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

后端 未结 8 2160
-上瘾入骨i
-上瘾入骨i 2020-11-28 00:27

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

相关标签:
8条回答
  • 2020-11-28 00:35

    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.

    0 讨论(0)
  • 2020-11-28 00:36

    You can use process.stdout.write():

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

    See the docs for details.

    0 讨论(0)
  • 2020-11-28 00:37

    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');
    
    0 讨论(0)
  • 2020-11-28 00:49

    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.

    0 讨论(0)
  • 2020-11-28 00:49

    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");
    });
    
    0 讨论(0)
  • 2020-11-28 00:50

    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");
    
    0 讨论(0)
提交回复
热议问题