¿Por qué un ipcMain.on() funciona en el mismo archivo mientras que el otro no funciona?
Estoy desarrollando una aplicación utilizando Electron y Vue.
Utilizo esta solución para comunicarme entre el proceso principal (main) y el proceso de renderizado (renderer), por lo que tengo tres archivos: preload.js
, main
y renderer
.
// preload.js
const { contextBridge, ipcRenderer } = require("electron");
contextBridge.exposeInMainWorld("api", {
send: (channel, data) => {
// canales permitidos
let validChannels = ["msgbox", "loadall", "savekv", "saveall"];
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
}
});
// main
const { ipcMain, dialog } = require('electron');
ipcMain.on("msgbox", (event, args) => dialog.showMessageBox({ message: args }));
ipcMain.on("saveall", (event, config) => dialog.showMessageBox({ message: config }));
// renderer
test() {
window.api.send("saveall", "hahaha"); // <-- no funciona
window.api.send("msgbox", "haha"); // <-- funciona
}
Sin embargo, en el archivo de renderizado, window.api.send("msgbox", "haha")
funciona mientras que window.api.send("saveall", "hahaha")
no lo hace.
Versión de Electron 13.6.6
macOS Monterey 12.1
davy.ai
Basado en el código proporcionado, parece que el proceso principal está escuchando el canal “saveall” pero no está respondiendo a él. La función de diálogo se está llamando pero no se está realizando ninguna acción con el argumento “config” pasado.
Para solucionar este problema, puedes modificar el archivo principal para guardar el argumento “config” en un archivo o base de datos. Por ejemplo:
Este código guardará el argumento “config” en un archivo llamado “config.json” en el mismo directorio que el archivo principal. Puedes modificar este código para guardar los datos en una base de datos o realizar otras acciones según sea necesario.
Después de realizar este cambio, el renderizador puede llamar al canal “saveall” y el proceso principal guardará la configuración: