Node.js formatted console output

node.jsConsole

node.js Problem Overview


Is there a simple built-in way to output formatted data to console in Node.js?

Indent, align field to left or right, add leading zeros?

node.js Solutions


Solution 1 - node.js

Two new(1) built in methods String.Prototype.padStart and String.Prototype.padEnd were introduced in ES2017 (ES8) which perform the required padding functions.

(1) node >= 8.2.1 (or >= 7.5.0 if run with the --harmony flag)

Examples from the mdn page:

'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "foo");  // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0");     // "00000abc"
'abc'.padStart(1);          // "abc" 

'abc'.padEnd(10);          // "abc       "
'abc'.padEnd(10, "foo");   // "abcfoofoof"
'abc'.padEnd(6, "123456"); // "abc123"
'abc'.padEnd(1);           // "abc"

For indenting a json onto the console try using JSON.stringify. The third parameter provides the indention required.

JSON.stringify({ a:1, b:2, c:3 }, null, 4);
// {
//    "a": 1,
//    "b": 2,
//    "c": 3
// }

Solution 2 - node.js

If the data is tabular, then the simplest way would be to do it with console.table

https://nodejs.org/dist/latest-v10.x/docs/api/console.html#console_console_table_tabulardata_properties

This is the code.

console.table(
  COMMANDS.map(command => {
    return {
      "Long Option": command.long_option,
      "Short Option": command.short_option,
      Description: command.description
    };
  })
);

You don't need external libraries for it. Here is sample output. You only need to pass an array object. enter image description here

Not only in Nodejs, but it also works in chrome.

https://developer.mozilla.org/en-US/docs/Web/API/Console/table

enter image description here

Solution 3 - node.js

There's nothing built into NodeJS to do this. The "closest" you'd come is util.format, which still doesn't do much unfortunately (reference).

You'll need to look into other modules to provide a richer formatting experience. For example: sprintf.

Sprintf-js allows both positional (0, 1, 2) arguments and named arguments.

A few examples of padding and alignment:

var sprintf=require("sprintf-js").sprintf;

console.log(sprintf("Space Padded => %10.2f", 123.4567));
console.log(sprintf("    _ Padded => %'_10.2f", 123.4567));
console.log(sprintf("    0 Padded => %010.2f", 123.4567));
console.log(sprintf(" Left align => %-10.2f", 123.4567));

Results:

Space Padded =>     123.46
    _ Padded => ____123.46
    0 Padded => 0000123.46
 Left align => 123.46    

Solution 4 - node.js

If you have simpler needs you can look into util.format. It can generate string from various parameters. If you want printf like formatting you can use either sprintf package or sprintf-js package.

Solution 5 - node.js

Take a look at Log4JS, which is an attempt at a functional port of Log4j

Solution 6 - node.js

Solution 7 - node.js

If I combine util.format and "".padStart/"".padEnd together,as described in posts above, then I get what I wated:

> console.log(util.format("%s%s","Name:".padEnd(10), "John Wall"))
Name:     John Wall

Solution 8 - node.js

A version of console.table for NodeJS with align.

> ⚠ This is only for console version! ⚠

/**
 * @param {NonNullable<{
 *    [key: string]: string
 *  }>} data
 */
const consoleTable = (data) => {
  if (typeof data === 'object') {
    const e = Object.entries(data);
    let kl = 0;
    let vl = 0;

    for (const [k, v] of e) {
      if (k.length > kl) {
        kl = k.length;
      }

      const s = JSON.stringify(v);
      const l = s ? s.length : 0;

      if (l > vl) {
        vl = l;
      }
    }

    /** @type {{ [key: string] : string }} */
    const result = {};

    for (const [k, v] of e) {
      const s = JSON.stringify(v);
      result[k.padStart(kl)] = s ? s.padEnd(vl) : v;
    }

    console.table(result);
  } else {
    console.table(data);
  }
};

Output example:

┌─────────────────┬────────────────────────────────────────────────────────────────────────────────────────┐
│     (index)     │                                         Values                                         │
├─────────────────┼────────────────────────────────────────────────────────────────────────────────────────┤
│     CONFIG_FILE'"/Users/ecuomo/projects/zzzzz/xxxxxxxx/tttttttttt-web/jjjjjjjjjj-commons/config.env"' │
│        NODE_ENV'"development"                                                                       ' │
│         APP_ENV'"local-dev-edu"                                                                     ' │
│     APP_VERSION'"0-local-ecuomo"                                                                    ' │
│        BASE_URL'"http://localhost:3000"                                                             ' │
│    CDN_BASE_URL'"http://localhost:3000/static"                                                      ' │
│    API_BASE_URL'"http://localhost:3000/api"                                                         ' │
│           MONGO'"mongodb://mongo:27017/xxxxxxxxxxprod"                                              ' │
│      MYSQL_HOST'"mysql"                                                                             ' │
│      MYSQL_PORT'3306                                                                                ' │
│    MYSQL_DB_ETL'"xxxxxxxxxx_etl"                                                                    ' │
│  MYSQL_DB_STATS'"xxxxxxxxxx_stats"                                                                  ' │
│ MYSQL_DB_ZAPIER'"xxxxxxxxxx_yyyyyy"                                                                 ' │
│   POSTGRES_HOST'"postgres"                                                                          ' │
│   POSTGRES_PORT'5432                                                                                ' │
│     POSTGRES_DB'"xxxxxxxxxx"                                                                        ' │
│      REDIS_HOST'"redis"                                                                             ' │
│      REDIS_PORT'"6379"                                                                              ' │
│    REDIS_MASTERundefined                                        │
│      REDIS_MODE'"single"                                                                            ' │
└─────────────────┴────────────────────────────────────────────────────────────────────────────────────────┘

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionexebookView Question on Stackoverflow
Solution 1 - node.jsTheChetanView Answer on Stackoverflow
Solution 2 - node.jsDivineCoderView Answer on Stackoverflow
Solution 3 - node.jsWiredPrairieView Answer on Stackoverflow
Solution 4 - node.jsuser568109View Answer on Stackoverflow
Solution 5 - node.jsLee GoddardView Answer on Stackoverflow
Solution 6 - node.jsjjstiffView Answer on Stackoverflow
Solution 7 - node.jsspikeyangView Answer on Stackoverflow
Solution 8 - node.jsEduardo CuomoView Answer on Stackoverflow