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,这就是为较长的数组截断数据的原因。
我是木偶师的新手。我曾经有 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,这就是为较长的数组截断数据的原因。