【问题标题】:console.log message is truncatedconsole.log 消息被截断
【发布时间】:2019-08-23 03:15:19
【问题描述】:

我是木偶师的新手。我曾经拥有 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 从标准输出中获取它。

【问题讨论】:

    标签: javascript node.js google-chrome puppeteer


    【解决方案1】:

    为什么console.log 不起作用

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

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


    解决方法:使用process.stdout

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

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

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

    【讨论】:

    • @ThomasDondorf @JohnRalston FWIW,此console.log() 行为涉及直接对象输出,不应截断字符串,因此console.log((JSON.stringify(data)) 就足够了。
    • @vsemozhetbyt 是的,这也应该有效。但我会评估直接写入流,而不是依赖于“不应以编程方式依赖”的函数。或者使用console.log有什么好处?
    • @ThomasDondorf 我想除了简单之外没有其他优势。
    • 未捕获的引用错误:未定义进程。为什么?请指导我。
    • 如果您想在控制数据截断方式的同时保留console.log() 提供的颜色,可以使用process.stdout.write(util.inspect(mydata, {colors: true, depth: 5, maxArrayLength: 20}))
    【解决方案2】:

    你也可以使用

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

    而不是

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

    【讨论】:

      【解决方案3】:

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

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

      默认情况下 maxArrayLength 为 100,这就是数据被截断以获取更长数组的原因。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 感谢您的回复,当我开始使用 phantomjs 时,我曾经写入文件,然后像您描述的那样让 php 解析它。后来我将两者合二为一。我会回到那个状态,我希望有一种方法可以在脚本运行时打印整个 innerhtml。再次感谢
        猜你喜欢
        • 2017-02-24
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2019-04-25
        相关资源
        最近更新 更多