【问题标题】:Node.js formatted console outputNode.js 格式化控制台输出
【发布时间】:2013-11-19 04:51:03
【问题描述】:

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

缩进、左对齐或右对齐、添加前导零?

【问题讨论】:

  • 我不知道其中任何一个,但类似的是colors,它可以格式化输出的字符串,例如"Green colour".green
  • 我假设您要求执行类似console.setup({ color: 'green', prepend: '0000' }) 的操作,但已经内置了?您可以创建自己的日志记录方法或覆盖 stdout.write 方法(尽管人们建议不要覆盖本机函数)。
  • 我在考虑 printf() 对输出字符串使用各种方便的格式修饰符。
  • 下面的答案很好。此外,如果您还想在标准 Node.js 输出中添加自动颜色,请查看 manakin

标签: node.js console


【解决方案1】:

在 ES2017 (ES8) 中引入了两个新的 (1) 内置方法 String.Prototype.padStartString.Prototype.padEnd,它们执行所需的填充功能。

(1) node >= 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
// }

【讨论】:

  • 可能值得注意的是,这仅在节点 >= 8.2.1(或 >= 7.5.0,如果使用 --harmony 标志运行)中受支持,因为它还比较新。跨度>
  • 这在 v8.1.2 上对我有用,即使没有标志。
  • 如果您没有看到这项工作,请不要忘记使用 .toString()。
【解决方案2】:

如果数据是表格的,那么最简单的方法是使用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
    };
  })
);

您不需要外部库。 这是示例输出。您只需要传递一个数组对象。

不仅在 Nodejs 中,它也适用于 chrome。

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

【讨论】:

  • 有什么办法让列的内容左缩进?默认居中对齐。
  • 有没有办法让文字左对齐?
【解决方案3】:

NodeJS 没有内置任何东西来执行此操作。你会来的“最接近”的是util.format,不幸的是它仍然没有多大作用(reference)。

您需要研究其他模块以提供更丰富的格式化体验。例如: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 的一部分......那么它会更有意义。
  • 我添加了几个例子来完善答案。
  • 我如何传递一个字符串?
  • @chovy-文档有很多例子,我建议你从那里开始。
【解决方案4】:

如果您有更简单的需求,可以查看util.format。它可以从各种参数生成字符串。如果您想要类似 printf 的格式,您可以使用 sprintf 包或 sprintf-js 包。

【讨论】:

  • 好像和我的回答一样? :)
  • 是的,只是晚了几分钟。
【解决方案5】:

看看Log4JS,这是对Log4j功能端口的尝试

【讨论】:

    【解决方案6】:

    【讨论】:

    • 嘿!欢迎来到堆栈溢出!尽管该链接可能包含问题的答案,但请确保您提供有关答案的基本信息,这样即使该链接被删除,答案仍然有效。谢谢!
    【解决方案7】:

    如果我将 util.format 和 "".padStart/"".padEnd 结合在一起,如上面的帖子中所述,那么我得到了我想要的:

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

    【讨论】:

      【解决方案8】:

      NodeJSconsole.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"                                                                            ' │
      └─────────────────┴────────────────────────────────────────────────────────────────────────────────────────┘
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多