Node.js格式化的控制台输出

78

在Node.js中,是否有一种简单的内置方式来将格式化数据输出到控制台?

缩进,将字段左对齐或右对齐,添加前导零等操作呢?


1
我不知道这些中的任何一个,但类似的一个是 colors,它可以格式化输出的字符串,例如 "Green colour".green - Matej
我猜你是想做类似于 console.setup({ color: 'green', prepend: '0000' }) 的事情,但已经内置了?你可以创建自己的日志方法或覆盖 stdout.write 方法(尽管人们建议不要覆盖原生函数)。 - matth
1
我在思考如何使用各种方便的格式修饰符来输出字符串,比如printf() - exebook
下面的答案很好。此外,如果您还想将自动颜色添加到标准的Node.js输出中,请查看manakin - vitaly-t
8个回答

75

在ES2017(ES8)中引入了两个新的内置方法String.Prototype.padStartString.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
// }

3
值得注意的是,此功能仅在Node版本大于等于8.2.1(或者在使用--harmony标志运行时版本大于等于7.5.0)中受支持,因为它是相对较新的功能。 - Semicolon
这在我的v8.1.2上即使没有标志也能正常工作。 - Jakub Macháček
如果你没有看到效果,请不要忘记使用.toString()。 - mdhansen

35

如果数据是表格形式的,那么最简单的方法就是使用console.table

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

这是代码。

console.table(
  COMMANDS.map(command => {
    return {
      "Long Option": command.long_option,
      "Short Option": command.short_option,
      Description: command.description
    };
  })
);
你不需要使用外部库。这是一个示例输出,你只需要传递一个数组对象。 enter image description here 不仅在Nodejs中可用,它也适用于Chrome浏览器。 https://developer.mozilla.org/en-US/docs/Web/API/Console/table enter image description here

17
有没有办法左对齐列的内容?它默认为居中对齐。 - Gaurang Patel
3
有没有一种方法可以将文本对齐到左边? - Omkar Somani

28

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    

5
util.format比没有好,但是提升不是很大。 :) 如果它只是console.log的一部分……那就更有意义了。 - WiredPrairie
我添加了一些例子来完善答案。 - WiredPrairie
如何传递一个字符串? - chovy
@chovy:文档中有许多示例,我建议你从那里开始。 - WiredPrairie

7

如果您的需求比较简单,可以考虑使用util.format函数。它可以从不同的参数生成字符串。如果想要类似于printf的格式化方式,可以使用sprintf包或sprintf-js包。


2
看起来就像是我的答案? :) - WiredPrairie
是的,只晚了几分钟。 - user568109

3

5
嘿!欢迎来到Stack Overflow!虽然链接可能包含问题的答案,但请确保您在回答中提供必要的信息,以便如果该链接被删除,答案仍然有效。谢谢! - Matheus Avellar

3

看一下Log4JS,它试图进行Log4j的函数式移植。


2

如果我结合上述帖子中描述的util.format和"".padStart/"".padEnd,那么我所需的内容就可以得到:

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

1

带有对齐功能的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"                                                                            ' │
└─────────────────┴────────────────────────────────────────────────────────────────────────────────────────┘

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接