You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:37:05