console.log 消息被截断

console.log message is truncated

我是木偶师的新手。我曾经有 PhantomJS 和 CasperJS,但在设置较新的服务器 (freebsd 12) 时发现对 PhantomJS 的支持已经消失,CasperJS 给了我分段错误。

我能够很好地将我的应用程序移植到 puppeteer,但是 运行 遇到了一个问题,当我想从 table 捕获数据时,这些数据似乎不完整或被截断了。

我需要 table 的所有信息,但总是得到更少。

我试过更小的 tables 但它也被截断了。 我不知道console.log缓冲区是否可以扩展,或者是否有更好的方法来获取table中所有tds的值。

const data = await page.$$eval('table.dtaTbl tr td', tds => tds.map((td) => {
    return td.innerHTML;
}));

console.log(data); 

我应该能够获取所有行,但我却得到了这个

[ 'SF xx/xxxx 3-3999 06-01-16',
'Sample text - POLE',
  '',

 /* tons of other rows (removed by me in this example) <- */

  '',

 /* end of output */ ... 86 more items ]

我还需要其他 86 件物品!!! 因为我 PHP 在执行代码时从 stdout 中获取它。

您一定要使用 stdout 吗?不建议这样做进行监视,因为 stdout 很容易溢出缓冲区(或输出不完整)- 正如您所看到的说明问题一样。

为什么不修改 PHP 脚本以使用 readfile 函数从文件作为流读取,并使用 fs 从您的 JS 代码写入该流?

为什么 console.log 不起作用

在幕后,console.log 使用 util.inspect,生成用于调试的输出。为了创建合理的调试信息,此函数将截断太长的输出。引用文档:

The util.inspect() method returns a string representation of object that is intended for debugging. The output of util.inspect may change at any time and should not be depended upon programmatically.


解决方法:使用process.stdout

如果您想将输出写入 stdout,您可以使用 process.stdout,这是一个可写流。它不会 modify/truncate 你在流上写的东西。你可以这样使用它:

process.stdout.write(JSON.stringify(data) + '\n');

我在末尾添加了换行符,因为该函数本身不会产生换行符(与 console.log 相反)。如果您的脚本不依赖它,您可以简单地删除它。

您也可以使用

console.log(JSON.stringify(数据, 空, 4));

而不是

process.stdout.write(JSON.stringify(数据) + '\n');

我知道这个问题是几年前的问题了,但这是我一次又一次看到的问题。发现(通过这个线程)底层的 util.inspect 调用帮助我通过以下方式解决了这个问题:

process.stdout.write(`${util.inspect(data, { maxArrayLength: 1000 })}\n`)

默认情况下 maxArrayLength 为 100,这就是为较长的数组截断数据的原因。