是否有一种简单的内置方法可以将格式化数据输出到 Node.js 中的控制台?
缩进,将字段左对齐或右对齐,添加前导零?
ES2017 (ES8) 中引入了两个 new(1) 内置方法String.Prototype.padStart和String.Prototype.padEnd,它们执行所需的填充功能。
(1)节点 >= 8.2.1(或 >= 7.5.0,如果使用 --harmony 标志运行)
来自 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
// }
如果数据是表格的,那么最简单的方法是使用console.table
这是代码。
console.table(
COMMANDS.map(command => {
return {
"Long Option": command.long_option,
"Short Option": command.short_option,
Description: command.description
};
})
);
不仅在 Nodejs 中,它也适用于 chrome。
https://developer.mozilla.org/en-US/docs/Web/API/Console/table
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。它可以从各种参数生成字符串。如果您想要类似 printf 的格式,您可以使用sprintf包或sprintf-js包。
您可能还喜欢 string-kit 和 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/
看看Log4JS,这是对 Log4j 功能端口的尝试
如果我将 util.format 和 "".padStart/"".padEnd 结合在一起,如上面的帖子中所述,那么我会得到我想要的:
> console.log(util.format("%s%s","Name:".padEnd(10), "John Wall"))
Name: John Wall
带有对齐console.table
的NodeJS版本。
⚠ 这仅适用于主机版!⚠</p>
/**
* @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" ' │
└─────────────────┴────────────────────────────────────────────────────────────────────────────────────────┘