在Node.js中,是否有一种简单的内置方式来将格式化数据输出到控制台?
缩进,将字段左对齐或右对齐,添加前导零等操作呢?
在ES2017(ES8)中引入了两个新的内置方法String.Prototype.padStart和String.Prototype.padEnd,用于执行所需的填充功能。
(1)node>=8.2.1(或带--harmony标志运行时>=7.5.0)
来自mdn页面的示例:
'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"
要在控制台上缩进json,请尝试使用JSON.stringify。第三个参数提供所需的缩进。
JSON.stringify({ a:1, b:2, c:3 }, null, 4);
// {
// "a": 1,
// "b": 2,
// "c": 3
// }
--harmony
标志运行时版本大于等于7.5.0)中受支持,因为它是相对较新的功能。 - Semicolon如果数据是表格形式的,那么最简单的方法就是使用console.table
。
这是代码。
console.table(
COMMANDS.map(command => {
return {
"Long Option": command.long_option,
"Short Option": command.short_option,
Description: command.description
};
})
);
你不需要使用外部库。这是一个示例输出,你只需要传递一个数组对象。
NodeJS内置的没有这个功能。你可以用util.format
来尽可能地接近,但不幸的是它并不能做太多的事情(参考资料)。
你需要寻找其他模块来提供更丰富的格式化体验。例如:sprintf。
Sprintf-js允许使用位置(0、1、2)参数和命名参数。
以下是一些填充和对齐的示例:
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));
结果:
Space Padded => 123.46
_ Padded => ____123.46
0 Padded => 0000123.46
Left align => 123.46
util.format
比没有好,但是提升不是很大。 :) 如果它只是console.log
的一部分……那就更有意义了。 - WiredPrairie如果您的需求比较简单,可以考虑使用util.format函数。它可以从不同的参数生成字符串。如果想要类似于printf的格式化方式,可以使用sprintf包或sprintf-js包。
如果我结合上述帖子中描述的util.format和"".padStart/"".padEnd,那么我所需的内容就可以得到:
> console.log(util.format("%s%s","Name:".padEnd(10), "John Wall"))
Name: John Wall
带有对齐功能的NodeJS版本console.table
。
⚠ 仅适用于控制台版本! ⚠
/**
* @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);
}
};
输出示例:
┌─────────────────┬────────────────────────────────────────────────────────────────────────────────────────┐
│ (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" ' │
└─────────────────┴────────────────────────────────────────────────────────────────────────────────────────┘
colors
,它可以格式化输出的字符串,例如"Green colour".green
。 - Matejconsole.setup({ color: 'green', prepend: '0000' })
的事情,但已经内置了?你可以创建自己的日志方法或覆盖stdout.write
方法(尽管人们建议不要覆盖原生函数)。 - matthprintf()
。 - exebook