nodejs-DataCloneError:function(){[native code]}无法克隆

时间:2018-11-28 11:40:23

标签: javascript node.js worker-thread

我正在尝试生成线程(使用新的Node.js模块“ worker_threads”),并将一个复杂的对象传递给它们中的每个对象,该对象是Puppeteer browser.newPage()实例的“页面”对象。我尝试同时使用workerData和MessageChannels-从文档:

  

port.postMessage:将JavaScript值发送到此通道的接收端。值将以与HTML结构化克隆算法兼容的方式进行传输。特别是,它可能包含循环引用和JSON API无法字符串化的对象,例如类型化数组。

但是我总是得到错误:

  

(节点:7133)UnhandledPromiseRejectionWarning:DataCloneError:function(){[native code]}无法克隆。       在Worker.postMessage(internal / worker.js:378:23)

我也尝试对其进行字符串化和解析,但是页面对象还包含一些无法从线程上下文进行评估的函数(我也想避免使用eval())。

问题是:如何将像Puppeteer browser.newPage()实例这样的复杂对象传递给Node.js中使用worker_threads生成的线程?

2 个答案:

答案 0 :(得分:0)

相信答案基本上是“不”。

您可以更改正在传递的内容,以便可以在另一侧“重构”它吗?

该模型类似于在通话中调用另一台服务器-您必须对所需的所有内容进行编码,然后在另一端对其进行修改。

答案 1 :(得分:0)

dethSwathch是正确的:您不能。仅某些少数本机数据类型允许消息传递,包括对象(和日期,当然还有TypedArrays)。这就是为什么您丢失所有类型信息和功能的原因。但是,您当然可以使用“裸”对象来填充新的Page实例(或任何其他自定义对象)。

此DataCloneError似乎是过去的限制。至少我无法复制它。该对象应自动复制而无需任何序列化。