Electron项目主进程发送的JSON在渲染进程接收为undefined求助
Electron IPC渲染进程接收数据为undefined的排查与解决
核心问题定位
你的预加载脚本中对IPC事件的转发逻辑,和渲染进程的回调参数声明不匹配,导致数据接收异常:
预加载脚本里的on方法实现,会丢弃IPC事件的event对象,只将后续参数传递给渲染进程的回调:
on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(...args))
但渲染进程的回调仍然以(event, jsonData)声明参数,这就导致实际的jsonData被赋值给了第一个参数event,而第二个参数jsonData自然是undefined。
解决方案
方案一:修改渲染进程的回调参数
去掉多余的event参数,直接接收数据:
window.ipcRenderer.on('lights-data', (jsonData) => { console.log('Trying to display data'); console.log(jsonData); });
方案二:修改预加载脚本的事件转发逻辑
保留event对象的传递,让渲染进程的回调和原生IPC逻辑一致:
const { contextBridge, ipcRenderer } = require('electron'); contextBridge.exposeInMainWorld('ipcRenderer', { send: (channel, data) => ipcRenderer.send(channel, data), on: (channel, func) => ipcRenderer.on(channel, func) });
额外排查点
如果上述方案无效,检查以下内容:
- 窗口初始化状态:调用
refreshLight时,确保mainWindow已经完成创建并加载完成。可以在mainWindow.webContents.on('did-finish-load', () => { /* 调用refreshLight */ })内触发数据请求。 - IPC通道名一致性:确认主进程发送的
'lights-data'和渲染进程监听的通道名完全一致,无拼写错误。 - 预加载脚本配置:创建
BrowserWindow时,确保webPreferences中正确配置了预加载路径,且上下文隔离已开启(Electron 12+默认开启):
const mainWindow = new BrowserWindow({ webPreferences: { preload: path.join(__dirname, 'preload.js'), contextIsolation: true } });
内容的提问来源于stack exchange,提问作者Recypher
相关产品推荐
相关产品推荐

