我正在编写一个复杂的自动化测试,该测试给了我误报。为了找出原因,我临时在测试的最后一行添加了
console.log
以打印出实际输出。经过大量故障排除后,我意识到console.log
打印了错误的信息。
这是我的日志语句:
console.log(`$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$`, document.documentElement.outerHTML);
我将其作为测试的最后一行,它会截断输出,以便在终端中打印格式错误的 HTML;一些结束标签没有对应的开始标签。
我发现这个 Node 文档 可以解释原因:
的输出。现在,它的异步特性总是会添加一个额外的变量。关于进程 I/O 的注释
和process.stdout
与其他 Node.js 不同 以重要方式流动:process.stderr
同步写入避免了诸如输出写入之类的问题
- 它们分别由
和console.log()
在内部使用。console.error()
- 写入可能是同步的,具体取决于流连接到的内容以及系统是 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 上运行节点?这可能是导致您出现问题的幕后原因。如果一个对象被传递给
util.inspect
处理,这可能会产生意外且被截断的结果。以下内容将绕过该功能并应产生预期结果:
process.stdout.write(JSON.stringify(putLogObjectHere) + '\n');