【问题标题】:Weird node.js console.log() output behaviour when printing arrays打印数组时奇怪的 node.js console.log() 输出行为
【发布时间】:2021-05-31 03:22:35
【问题描述】:

我在 node.js v14.13.1 环境中运行的 VSCode(Mac OS) 中有以下一些简单的代码:

let fruits = ['Apple', 'Banana'];
let fruits1 = ['Apple1', 'Banana1'];
console.log(fruits);
console.log(fruits1);

输出行为对我来说似乎很奇怪,它会打印:

(2) ['Apple', 'Banana']

(2) ['Apple', 'Banana']
(2) ['Apple1', 'Banana1']

(2) ['Apple', 'Banana']
Canceled

我找不到任何特定的打印模式(除了前两个输出的打印频率高于第三个),所以它似乎“随机决定”输出什么。

但是,当通过 Mac 终端 (node my_file.js) 执行时,此代码始终按预期输出,即:

[ 'Apple', 'Banana' ]
[ 'Apple1', 'Banana1' ]

这是某种 VSCode 错误,还是有一些关于使用 console.log() 打印数组的问题(使用字符串和整数可以正常工作)我没有考虑到什么?

【问题讨论】:

  • 你的第一个代码块本身总是会输出完全相同的东西,所以如果你看到不同的东西,那么肯定有比你在这里显示的更多的代码。
  • 当我遇到问题时,当然还有更多的代码。但是,为了排除故障,我只用这 4 行代码创建了一个新文件,如果需要,我可以附上屏幕截图。
  • 请不要附上代码截图,而是显示问题的实际代码。您发布的四行将始终导致相同的输出。所以你的代码中必须有其他东西(可能是一些异步部分或抛出错误的东西......)
  • 1) 已经没有截图了,我上面提到的“截图提案”只是为了证明这段代码就是文件中的所有内容。 2)正如我在上面的评论中所说,这篇文学作品是我在文件中的所有代码,足以重现这个问题。
  • 也遇到了这个问题,似乎通常发生在连续数组日志记录中?如果您在日志之后的某处添加断点,则该行为会得到修复,但这本身就很烦人。

标签: node.js arrays visual-studio-code console.log vscode-debugger


【解决方案1】:

您可以尝试的一种解决方案是在执行 console.log 命令时将数组转换为字符串:

let fruits = [['Apple', 'Banana'],['Apple', 'Banana']];
console.log(fruits.toString());  // Apple,Banana,Apple,Banana
console.log('' + fruits);  // Apple,Banana,Apple,Banana
console.log(JSON.stringify(fruits));  // [["Apple","Banana"],["Apple","Banana"]]

我喜欢最后一个,因为它使这个数组显示在括号内,即使是多维数组也是如此。

但是,我发现一个问题是在使用正则表达式时,转换为字符串时会丢失附加输出:

let str = 'xyz';
let pat = /y/;
let res = str.match(pat);
console.log(res);  // ['y', index: 1, input: 'xyz', groups: undefined]
console.log(res.toString());  // y
console.log('' + res);  // y
console.log(JSON.stringify(res));  // ["y"]

我相信这个错误可能是因为调试器在输出发送到调试控制台之前停止?因此,对于另一种解决方案,可以在代码末尾添加一个空行并在那里添加一个断点;这似乎允许在对数组执行多个 console.logs 时生成所有输出。或者,在代码末尾添加:

setTimeout(() => { }, 1000)

这似乎也增加了足够的时间来正确输出所有 console.log 数组。前者的好处是,您可以在调试控制台中展开数组详细信息,直到您继续到代码的末尾,但缺点是您仍然必须选择继续代码才能结束。后者还允许您在输出中扩展对象的详细信息,但仅限于计时器的持续时间。

我还发现,您可以将其中任何一个添加到您的 launch.json 文件中(在适当的节点配置对象中,并且不要忘记在前一行的末尾和/或末尾添加一个 common这些行中的任何一条取决于您插入的位置):

"console": "integratedTerminal"

或者:

"console": "externalTerminal"

这些将输出发送到 VS Code 终端窗格或外部 cmd 窗口。

最后我还发现,除了这些控制台命令中的任何一个,您都可以将其添加到launch.json:

"outputCapture": "std"

这会将输出保留在调试控制台中。颜色和其他一些消息看起来有点不同,但似乎成功输出了数组。

【讨论】:

    【解决方案2】:

    我也有同样的问题。我认为这是某种 VSCode 错误。
    当我在事件回调中打印 data 时,console.log 的行为符合预期。但是过了一会儿,主线程存在,console.log输出Canceled

    import some modules...
    
    vtgeojson(tiles, { tilesOnly: true })
      .on('data', function (data) {
        featurecollection.features.push(data);
        console.log(data)
      })
      .on('end', function () {
        console.log(featurecollection);
        console.log(featurecollection.features.length);
      })
    

    当我设置断点并逐行打印data时,问题就消失了。

    当我在 powershell 中运行脚本时,问题也消失了。

    虽然console.log被取消了,但data已经成功推入feature list。该行为很可能是由 vscode 终端或 vscode 处理console.log 命令的方式引起的。

    我的node版本是v12.20.0,VSCode版本是:

    Version: 1.51.1 (system setup)
    Commit: e5a624b788d92b8d34d1392e4c4d9789406efe8f
    Date: 2020-11-10T23:34:32.027Z
    Electron: 9.3.3
    Chrome: 83.0.4103.122
    Node.js: 12.14.1
    V8: 8.3.110.13-electron.0
    OS: Windows_NT x64 10.0.17763
    

    我发现其他人也有类似的问题。
    console.log() is “Canceled” when looping unattended

    【讨论】:

      【解决方案3】:

      这看起来很有趣。我已经尝试多次运行它并得到与 Chrome 控制台输出相同的结果:

      ["Apple", "Banana"]
      ["Apple1", "Banana1"]
      

      问题可能与您在计算机上运行的 Node.js 版本或您拥有的 VSCode 版本上的终端有关。

      因为我尝试从 VSCode 终端运行它并得到相同的结果:

      【讨论】:

      • 在 VSCode 终端中,它对我来说也很好用。使用 F5 'Start Debugging' 执行代码时存在问题,即我说的是 DEBUG CONSOLE 中的输出,可能应该在问题帖子中更清楚。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多