即使我在 Windows 终端中运行 Node.js,我也可以使 console.log 同步吗?

问题描述 投票:0回答:1

我正在编写一个复杂的自动化测试,该测试给了我误报。为了找出原因,我临时在测试的最后一行添加了

console.log
以打印出实际输出。经过大量故障排除后,我意识到
console.log
打印了错误的信息。

这是我的日志语句:

console.log(`$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$`, document.documentElement.outerHTML);
我将其作为测试的最后一行,它会截断输出,以便在终端中打印格式错误的 HTML;一些结束标签没有对应的开始标签。

我发现这个 Node 文档 可以解释原因:

关于进程 I/O 的注释

process.stdout
process.stderr
与其他 Node.js 不同 以重要方式流动:

  1. 它们分别由
    console.log()
    console.error()
    在内部使用。
  2. 写入可能是同步的,具体取决于流连接到的内容以及系统是 Windows 还是 POSIX:
    • 文件:Windows 和 POSIX 上的同步
    • TTY(终端):Windows 上
    • 异步,POSIX 上同步 管道(和套接字):
    • Windows 上的同步
    • ,POSIX 上的异步
    这些行为部分是出于历史原因,因为改变它们 会造成向后不兼容,但它们也是预期的 一些用户。
同步写入避免了诸如输出写入之类的问题

console.log()

console.error()

 意外交错,
或者如果在 之前调用 
process.exit()
 则根本不写
异步写入完成。更多信息请参见
process.exit()
信息。
我曾经以为我可以相信

console.log
的输出。现在,它的异步特性总是会添加一个额外的变量。

我正在 Windows 10 上通过 Mintty 终端上的 Cygwin 运行 node.js。以下是这些命令的输出:

$ node -p "Boolean(process.stdin.isTTY)" true $ echo "foo" | node -p "Boolean(process.stdin.isTTY)" false $ node -p "Boolean(process.stdout.isTTY)" true $ node -p "Boolean(process.stdout.isTTY)" | cat false

这是我的问题:
有没有办法使

console.log()console.error()

 同步,即使我在终端的 Windows 上运行节点?

这可能是导致您出现问题的幕后原因。如果一个对象被传递给
javascript node.js windows jasmine cygwin
1个回答
0
投票
,它将由

util.inspect

 处理,这可能会产生意外且被截断的结果。以下内容将绕过该功能并应产生预期结果:
process.stdout.write(JSON.stringify(putLogObjectHere) + '\n');


© www.soinside.com 2019 - 2024. All rights reserved.