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,
eventwill 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 passfuncto ipcRenderer like so:Then, any
funcparameter 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
contextBridgedefinition. Then, any instance ofipcRenderer.on()in your renderer code will need to change to fit the signature(...data) => {}since there's noeventparameter 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.