大量数据的 Node 数组 console.log 显示“...还有86项”

24

我是puppeteer的新手。我以前使用PhantomJS和CasperJS,但在配置新服务器(freebsd 12)时发现PhantomJS的支持已经消失了,而CasperJS给我带来了分段错误。

我成功地将我的应用程序移植到puppeteer,但遇到了一个问题,即当我想从表中捕获数据时,这些数据似乎是不完整或被截断的。

我需要来自表格的所有信息,但总是得到较少的信息。

我尝试过更小的表格,但结果仍然被截断了。 我不知道console.log缓冲区是否可以扩展,也不知道是否有更好的方法来获取表中所有td的值。

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中拿到它。

4个回答

43

为什么 console.log 不工作

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

util.inspect()方法返回一个对象的字符串表示形式,旨在进行调试。util.inspect的输出可能会随时更改,不应以编程方式依赖它


解决方案:使用 process.stdout

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

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

我在最后添加了一个换行符,因为该函数不会自动产生换行符(与console.log相反)。 如果您的脚本不依赖于它,您可以将其简单地去掉。


4
@ThomasDondorf @JohnRalston,FWIW,这个 console.log() 行为涉及到直接对象输出,字符串不应被截断,因此 console.log((JSON.stringify(data)) 就足够了。 - vsemozhebuty
@vsemozhetbyt 是的,那也可以。但我更愿意直接写入流,而不是依赖于一个说“不应该在程序中依赖”的函数。或者使用 console.log 有什么优势吗? - Thomas Dondorf
@cSharma 你在浏览器环境下吗?这个问题是关于Node.js的。你可以在浏览器中尝试使用console.log代替process.stdout.write - Thomas Dondorf
4
如果你想保留 console.log() 输出的颜色并同时控制数据截断的方式,可以使用 process.stdout.write(util.inspect(mydata, {colors: true, depth: 5, maxArrayLength: 20})) - Cédric
我在一个React Native应用中尝试了你的解决方案,但它并没有起作用。你有其他的替代方案吗? - Contestosis
显示剩余3条评论

10

你也可以使用

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

替代

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

对我来说完美无缺。谢谢。 - undefined
注意:如果对象足够大,console.log 会无法预测地截断输出...即使使用 JSON.stringify...这就是为什么我在这里的原因。stdout.write 方法将始终起作用。 - undefined

2

我知道这个问题已经存在了几年,但我一遍又一遍地看到了这个问题。通过这个线程发现的底层util.inspect调用帮助我以以下方式解决了这个问题:

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

默认情况下,maxArrayLength为100,因此对于较长的数组,数据会被截断。


maxArrayLength: null 可以移除任何限制。 - Stanislav Volodarskiy

-1

感谢您的回复。当我刚开始使用phantomjs时,我习惯于将其写入文件,然后像您描述的那样让php解析它。后来我将两者合并为一步。现在我会回到以前的方式,但我还是希望能够在脚本运行时打印整个innerhtml。再次感谢。 - John Ralston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接