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?
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).
util.format
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
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.
Take a look at Log4JS, which is an attempt at a functional port of Log4j
You might also like string-kit and terminal-kit.
https://www.npmjs.com/package/string-kit
https://www.npmjs.com/package/terminal-kit
https://blog.soulserv.net/terminal-friendly-application-with-node-js-part-ii-moving-and-editing/
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 // }
If the data is tabular, then the simplest way would be to do it with console.table
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.
Not only in Nodejs, but it also works in chrome.
https://developer.mozilla.org/en-US/docs/Web/API/Console/table
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
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_MASTER │ undefined │ │ REDIS_MODE │ '"single" ' │ └─────────────────┴────────────────────────────────────────────────────────────────────────────────────────┘