es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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

Tags:  , ,

Answer

  1. Avatar for 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:

    // main
    const { ipcMain, dialog } = require('electron')
    const fs = require('fs')
    
    ipcMain.on("msgbox", (event, args) => dialog.showMessageBox({ message: args }))
    
    ipcMain.on("saveall", (event, config) => {
      // guardar el config en un archivo o base de datos
      fs.writeFile('config.json', JSON.stringify(config), (err) => {
        if (err) throw err;
        console.log('¡Configuración guardada!');
      });
    })
    

    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:

    // renderer
    test() {
      window.api.send("saveall", "hahaha");  // <- ahora funciona
      window.api.send("msgbox", "haha");     // <- aún funciona
    }
    

Comments are closed.