19

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

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

但我总是得到错误:

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

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

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

4

2 回答 2

3

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

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

于 2019-05-31T05:38:00.823 回答
2

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

你能改变你传递的东西,这样你就可以在另一边“重构”它吗?

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

于 2018-12-27T18:11:25.247 回答