I am trying to send data from the main process to the renderer and the ipcRenderer.on function is being executed but the data is undefined...
This is the code to send the data:
mainWindow.webContents.on("did-finish-load", () => {
let name = "test";
mainWindow.webContents.send("updateSave", name);
})
And this to receive it:
ipcRenderer.on("updateSave", (e, data) => {
console.log("data: " + data);
})
The console.log is beeing fired but it just says: data: undefined
And this is the preload file:
contextBridge.exposeInMainWorld("ipcRenderer", {
send: (channel, ...args) => ipcRenderer.send(channel, ...args),
on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(...args))
});
Does anybody know what I did wrong? Thanks
In your
preload.js
, you're definingipcRenderer.on()
as follows:Thus,
event
will never get passed tofunc()
and is thus swallowed. Now, there are two possible solutions (personally, I'd go with (1) because it's easiest to implement and will make for cleaner code on both parts. However, please see the remark below):(1) You want to keep the signature in your renderer
I.e., you want to still write
ipcRenderer.on("channel", (event, data) => {});
. Then you will have to change your preload code. I suggest to simply passfunc
to ipcRenderer like so:Then, any
func
parameter must have the signature(event, ...data) => {}
.(2) You want to keep the signature in your preload
I.e., you want to keep the code of your preload
contextBridge
definition. Then, any instance ofipcRenderer.on()
in your renderer code will need to change to fit the signature(...data) => {}
since there's noevent
parameter passed to the function.As a side note, it is considered a best practice if you don't expose Electron API function (such as
ipcRenderer.on()
,ipcRenderer.send()
etc) to the renderer when proxying using a preload script, but instead provide discrete functions for your renderer code to choose from, as shown in Electron's official IPC tutorial.