console.log消息被截断

时间:2019-04-01 21:31:37

标签: javascript node.js google-chrome puppeteer

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

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

我需要表中的所有信息,但总会减少。

我尝试过较小的表,但是它也被截断了。 我不知道console.log缓冲区是否可以扩展,或者是否有更好的方法来获取表中所有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提取它。

3 个答案:

答案 0 :(得分:2)

为什么console.log不起作用

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

  

util.inspect()方法返回用于调试的对象的字符串表示形式。 util.inspect的输出可能随时更改,不应以编程方式依赖


解决方案:使用process.stdout

如果要将输出写到stdout,可以使用process.stdout,它是可写的流。它不会修改/截断您在流上编写的内容。您可以像这样使用它:

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

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

答案 1 :(得分:0)

您是否绝对必须使用stdout?不建议这样做进行监视,因为stdout很容易溢出缓冲区(或输出不完整),正如您所看到的那样,它可以说明问题。

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

答案 2 :(得分:0)

你也可以使用

console.log(JSON.stringify(data, null, 4));

代替

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