如何通过 contextBridge / IPCRenderer 将结果发送给发送者?

How to send a result to sender via contextBridge / IPCRenderer?

我有一个像这样的电子

const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('electron', {
  electronStore: {
    get(val) {
      ipcRenderer.send('electron-store-get', val);
    },
    set(property, val) {
      ipcRenderer.send('electron-store-set', property, val);
    },
    // Other method you want to add like has(), reset(), etc.
  },
});

和看起来像这样的 ipcMain


ipcMain.on('electron-store-get', async (event, val) => {
  store.get(val);
  // console.log(reply);
  // return reply;
  // event.reply('electron-store-get', reply);
});
ipcMain.on('electron-store-set', async (event, property, val) => {
  // console.log(val);
  store.set(property, val);
});

当我试图通过 electron.electronStore.get() 调用该函数时,它 returns 未定义

let a = window.electron.electronStore.get('test');
console.log(a);

但是,我在ipcRenderer.send("") 的线上测试过,我可以通过如下设置接收数据

let result = ipcRenderer.send('electron-store-get',val);
console.log(result);

这意味着,ipcRenderer 不是未定义的,并且设置已经成功,获取也是如此,只是当我调用 ipcMain Get 函数时它丢失了

您当前的预加载 API 实际上没有返回任何东西:

get(val) {
   ipcRenderer.send('electron-store-get', val);
}

您需要使用同步 API: return ipcRenderer.sendSync('electron-store-get', val) 然后让您的处理程序在 main do:

ipcMain.on('electron-store-get', (event, val) => {
  event.returnValue = store.get(val);
});

或者使预加载 API 异步:

get(val) {
   return ipcRenderer.invoke('electron-store-get', val);
}
ipcMain.handle('electron-store-get', (event, val) => {
  return store.get(val);
});

然后:

let a = await window.electron.electronStore.get('test');