为什么我的值总是'undefined'当发送数据从主要呈现在ElectronJS?

osh3o9ms  于 2023-08-01  发布在  Electron
关注(0)|答案(2)|浏览(110)

我是电子公司的新手,还在熟悉IPC的通讯。我能够通过IPC发送和接收消息(这意味着我可以在两个方向上确认send和receive语句正在触发)。当我从renderer向main发送一个值时,这个值完全可以正常打印出来。我不明白的是,为什么当我试图从main向renderer发送一个值时,无论该值是什么,它总是以“未定义”的形式出现。send和receive语句仍在触发,只是值不能正确显示。
这里我从renderer发送到main:

const dataSend = "Test Data"
ipcRenderer.send('tester:send', {
    dataSend
});

字符串
在main中,我接收信号,(成功地)打印出与它一起发送的数据,然后通过新信号将新值发送回渲染器:

ipcMain.on('tester:send', (e, options) => {
    console.log(options.dataSend);

    const newData = "The Final Data";
    mainWindow.webContents.send('tester:toRender', {
        newData
    });
});


它在渲染器中接收到:

ipcRenderer.on('tester:toRender', (e, options) => {
    console.log("YUP IT ARRIVED");
    console.log(options.newData);
})


console.log仍然可以正常触发,但无论数据类型或值是什么,它总是会显示为undefined。我被卡住了,我不明白,任何帮助都会很棒。
我只是想一种方法来发送一个消息从渲染器到主访问一些数据,包的数据在主和发送回渲染器使用可见的html元素。我不明白为什么我可以很好地将消息从main发送到renderer,并且接收代码将执行,但数据在此过程中丢失了。
编辑:这是我的preload.js:

//NOTES:
// The preload function is mainly used for exposing nodes to the renderer
// to be used outside the scope of this file

const fs = require('fs');
const os = require('os');
const path = require('path');
const Toastify = require('toastify-js');
const { contextBridge, ipcRenderer} = require('electron');

//Allows use of functions from nods to be used inside main and render
contextBridge.exposeInMainWorld('os', {
    homedir: () => os.homedir()
});

contextBridge.exposeInMainWorld('path', {
    join: (...args) => path.join(...args)
});

contextBridge.exposeInMainWorld('Toastify', {
    toast: (options) => Toastify(options).showToast(),
});

contextBridge.exposeInMainWorld('ipcRenderer', {
    send: (channel, data) => ipcRenderer.send(channel, data),
    on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(...args)),
});

enyaitl3

enyaitl31#

尝试将window.ipcRenderer = require('electron').ipcRenderer添加到预加载文件。
ipcRenderer在渲染器中是如何定义的?

dw1jzc5e

dw1jzc5e2#

我认为问题在于你如何重新定义ipcRenderer.on,当你运行func回调函数时,你传入...args来代替事件。看看这个更新的代码:

contextBridge.exposeInMainWorld('ipcRenderer', {
    send: (channel, data) => ipcRenderer.send(channel, data),
// before you just had func(...args) but the callback is actually (event, ...args)
    on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(event, ...args)), 
});

字符串

相关问题