【问题标题】:Allow for control chars with util.inspect / console.log允许使用 util.inspect / console.log 控制字符
【发布时间】:2018-08-04 21:03:09
【问题描述】:

我有一个错误的回调:

return cb({code, message: `Could not run the following command: "${chalk.bold(cmd)}".`}, result);

它的处理方式如下:

if (err) {
   console.error(err);
   process.exit(1);
 }

我明白了(注意控制字符):

{ code: 1,
  message:
   'Could not run the following command: "\u001b[1mnpm view @oresoftware/foo2@latest dist --json\u001b[22m".' }

我也尝试过这样处理:

if (err) {
   console.error(util.inspect(err));
   process.exit(1);
 }

if (err) {
   console.error(chalk.magenta(util.inspect(err)));
   process.exit(1);
 }

但我似乎总是得到控制字符 - 有没有办法配置 util.inspect() 以接受控制字符?

https://nodejs.org/api/util.html#util_util_inspect_object_options

这是一个非常简单的重现:

const chalk = require('chalk');
const util = require('util');
console.log(util.inspect({message: `Here is the highlighted message ${chalk.bold('foo bar baz')}`}));

【问题讨论】:

  • 请注意util.inspect(x, {colors:true}) 不能解决问题。使用 colors:true 实际上在较新的 nodejs 版本中默认执行 console.log() 的操作。

标签: node.js


【解决方案1】:

util.inspect escapes control characters,无法更改。

转义序列可以不转义,如related question 中所述,例如:

console.log(JSON.parse(`"${util.inspect(obj).split('"').join('\\"')}"`))

或者可以使用任何现有的第三方包做同样的事情,例如unescape-js.

【讨论】:

    【解决方案2】:

    我想也许 JSON.stringify 正在向控制字符添加一个 escape()。就是这样,经过研究,我创建了一个解决方案,但发现它发布在另一个 SO 帖子中:Node JS, logging JSON with ansi code

    OP @Cohars 提议的地方(与我的相同)

    JSON.stringify(o)
      .replace(/\\/g, '')
      .replace(/u001b/g, '\u001b')
    

    现在,如果是util.inspect,我认为同样的解决方案应该可行:

    util.inspect(obj)
      .replace(/\\/g, '')
      .replace(/u001b/g, '\u001b')
    

    注意:我不明白我们是否应该将问题标记为重复。但是当你问了一个完全不同的问题时,我想也许这个问题应该被视为另一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2015-08-13
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      相关资源
      最近更新 更多