Uncaught(in promise)错误:无法在Electron中克隆对象

2fjabf4q  于 2023-04-18  发布在  Electron
关注(0)|答案(1)|浏览(462)

我想把我的文件从主目录发送到渲染器。但在此之前,我试图检查,如果它真的工作。因此,我console.log(files)。但我得到了错误你能帮我解决这个问题吗?我知道发送不可序列化的对象是不可能的,但我不知道如何实现它。
Uncaught(in promise)错误:无法克隆对象

renderer.js

function App() {
  
  useEffect(() => {

    window.electronAPI.handleFile((event, files) => {

      console.log(files)
    })



  })
  

  return (
    <div >

      <div>
        <button onClick={() => {
          const test = "From App"
          window.electronAPI.sendGetFile(test);
        }}>Hello</button>
</div>
</div>
)
}

preload.js

const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('electronAPI', {
    sendGetFile: (data) => ipcRenderer.send('send-getFile', data),
    handleFile: (files) => ipcRenderer.invoke('handle-file', files).then((filee) => {
        console.log(filee)
    })
})

main.js

ipcMain.handle('send-getFile', async (event, data) => {
        const filee = () => {
            const directoryPath = '/home/xyz/Javascript/';
            //passsing directoryPath and callback function
            fs.readdir(directoryPath, function (err, files) {
                //handling error
                if (err) {
                    return console.log('Unable to scan directory: ' + err);
                }
                //listing all files using forEach
                files.forEach(function (file) {
                    // Do whatever you want to do with the file
                    console.log(file);
                    return file
                });
            });

        }
        //const filee = "shashank from main"
        console.log(data)
        mainWindow.webContents.send("handle-file", filee)

        //     const webContents = event.sender
        // const win = BrowserWindow.fromWebContents(webContents)
        // win.setTitle(args)

    })
oxalkeyp

oxalkeyp1#

似乎你传递了一个回调函数给你的预加载器handleFile函数,然后通过ipc传递。
注意,所有通过ipc传递的参数都需要通过Structured clone algorithm克隆,而Structured clone algorithm不支持克隆函数。
一个可能实现您所寻找的功能的选项是使用单个ipc调用,通过如下promise返回filee值:

main.js

ipcMain.handle('send-getFile', async (event, data) => {
    const filee = () => { ... }
    return filee
})

renderer.js

function App() {
  
  const handleFile = async (file) => {
    const filee = await window.electronAPI.sendGetFile(file)
    console.log(filee)
  }

  return (
        <button onClick={() => {
          const test = "From App"
          handleFile(test);
        }}>Hello</button>
  )
}

相关问题