ipcRenderer EventEmitter无法使用电容器和电子/vue



我正在尝试开发一个同时在电子和电容器android上运行的项目。我在运行电子应用程序时遇到这个错误。它与预加载脚本有关。这个脚本允许我在主线程和vue线程之间进行IPC。安装了电容器后,我的电子IPC都不工作了。

这就是错误:

Uncaught Error: Cannot read properties of undefined (reading 'length')
at EventEmitter.<anonymous> (VM115 preloadx.js:49:57)
at EventEmitter.emit (VM14 node:events:390:28)
at Object.onMessage (VM113 renderer_init:69:746)

这是渲染器脚本。它在公用文件夹中。节点将其放入"out"文件夹,在执行过程中会在该文件夹中找到它。

const {
contextBridge,
ipcRenderer, 
} = require("electron");
let validChannels = [
"api",
"ascii",
// some channels here ...
"py-neo",
];

contextBridge.exposeInMainWorld(
"api", {
send: (channel, data) => {
// whitelist channels
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
},
receive: (channel, func) => {
if (validChannels.includes(channel)) {
// Deliberately strip event as it includes `sender` 
ipcRenderer.on(channel, (event, ...args) => func(...args)); // <-- error on this line!!
}
},
sendSync: (channel, data) => {
// whitelist channels
if (validChannels.includes(channel)) {
return ipcRenderer.sendSync(channel, data);
}
},
}
);

以下是来自主线程js文件的一些代码。

function createWindow() {
console.log("createWindow", __dirname);
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
//sandbox: true,
contextIsolation: true, 
enableRemoteModule: true, 
nodeIntegration: true,  
nodeIntegrationInWorker: true, 
preload: path.join(__dirname, "out", "preload.js"), // use a preload script
},
});

我使用的是电子18.1.0和节点16.15.1。当我在桌面上启动时,我希望IPC能正常工作。当我在安卓工作室发布时,它不需要工作。下面是我的package.json文件中的一段。

"scripts": {
"start": "vue-cli-service build && electron --disable-gpu --disable-software-rasterizer .  ",
"dist": "electron-builder",
"build": "vue-cli-service build",
"android": "npx cap sync android"
},

我做了如下操作来删除错误消息。

contextBridge.exposeInMainWorld(
"api", {
send: (channel, data) => {
// whitelist channels
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
},
receive: (channel, func) => {
if (validChannels.includes(channel)) {
// Deliberately strip event as it includes `sender` 
ipcRenderer.on(channel, (event, ...args) => {
console.log(channel , ...args);
try {
func(...args);
}
catch {
console.log(...args);
}
//func(...args)
});
}
},
sendSync: (channel, data) => {
// whitelist channels
if (validChannels.includes(channel)) {
return ipcRenderer.sendSync(channel, data);
}
},
}
);