electron IPC通信报错Uncaught (in promise) Error: An object could not be cloned.

项目场景:

electron+react

问题描述

electron 中用IPC通信
Uncaught (in promise) Error: An object could not be cloned.

	e Error: An object could not be cloned.
    at EventEmitter.i.invoke (node:electron/js2c/sandbox_bundle:33)
    at uploadImg (YakitPluginInfo.tsx:360)
    at AjaxUploader.post (AjaxUploader.js:323)
    at AjaxUploader.js:135
    at Array.forEach (<anonymous>)
    at AjaxUploader.js:134

原因分析:

传递的对象有方法就会报错


解决方案:

json.stringify()

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Electron 中,由于安全原因,部分对象无法通过 IPC 通信传递,包括 Blob 对象。如果需要在渲染进程和主进程之间传递 Blob 对象,可以先将其转换为 ArrayBuffer 或字符串等支持的数据类型,然后再传递。 以下是在渲染进程中将 Blob 格式的文件流转换为 ArrayBuffer,然后将其传递给主进程的示例代码: ```javascript // 渲染进程 const { ipcRenderer } = require('electron'); const fileInput = document.querySelector('input[type="file"]'); fileInput.addEventListener('change', (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = () => { const arrayBuffer = reader.result; ipcRenderer.send('blob-data', { arrayBuffer, type: file.type }); }; reader.readAsArrayBuffer(file); }); ``` 上面的代码使用 `FileReader` 对象读取用户选择的文件,然后将文件内容作为 ArrayBuffer 对象发送给主进程,并在同一对象中传递文件类型 `type`。 在主进程中,可以使用以下代码监听渲染进程发送的事件并处理数据: ```javascript // 主进程 const { ipcMain } = require('electron'); const fs = require('fs'); ipcMain.on('blob-data', (event, data) => { const arrayBuffer = data.arrayBuffer; const type = data.type; const buffer = Buffer.from(arrayBuffer); const filePath = 'path/to/save/file'; fs.promises.writeFile(filePath, buffer) .then(() => { // 文件保存成功 }) .catch((error) => { // 文件保存失败 }); }); ``` 上面的代码使用 `Buffer.from()` 方法将 ArrayBuffer 对象转换为 Buffer 对象,然后将其写入本地文件系统。 需要注意的是,在处理二进制数据时,需要确保传递的数据不超过 IPC 通道的最大限制。如果数据过大,应该考虑分批传输,或者使用流的方式进行传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值