Node.js - DataCloneError: function () { [native code] } 无法被克隆

22
我正在尝试生成线程(使用新的Nodejs模块“worker_threads”),并向它们中的每一个传递一个复杂对象,该对象是Puppeteer browser.newPage()实例的“page”对象。我尝试使用workerData和MessageChannels - 根据文档:

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

但我总是收到错误:

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

我也尝试了stringify和parse,但页面对象还包含函数,我无法从线程上下文中求值(我也想避免使用eval())。

问题是:如何将类似于Puppeteer browser.newPage()实例的复杂对象传递给使用worker_threads在Nodejs中生成的线程?


非常准确的问题,我也在寻找相同的解决方案。 - MechaCode
2个回答

4

dethSwathch 是正确的:你不能这样做。仅允许针对一些本机数据类型进行消息传递,包括Object(和Date以及当然是TypedArrays)。这就是为什么您会失去所有类型信息和函数。但是,您可以使用“裸”对象来填充新的Page实例(或任何其他自定义对象)。

这个 DataCloneError 似乎是过去的限制。至少我无法复制它。对象应该在没有任何序列化的情况下自动复制。


3

相信答案基本上是否定的。

你能否更改传递的内容,以便你可以在另一端“重构”它?

这种模型类似于向另一个服务器发出调用-您必须对所需的所有内容进行编码,然后在另一端重新组合它。


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