node.js - Ingen hanterare registrerad för kanal - Electron IPC handle/invoke


I min Electron-app får jag ett felmeddelande "No handler registered for 'channel-name' at EventEmitter../lib/renderer/api/ipc-renderer.ts.ipcRenderer.invoke (electron/js2c/renderer_init.js:1163:19)". IPC-hanteraren är inte registrerad och kommunikationen mellan renderer- och huvudprocessen fungerar inte som förväntat i Windows.

När jag öppnar appen från Windows-installationen ser jag detta problem och det är intermittent när jag öppnar appen från programmen på Windows.

Här är kodavsnittet som visar hur jag använde ipc handle/invoke.

I Main.ts-filen

import {ipcMain} from 'electron';
private registerIpcChannels(ipcChannels: IpcChannelInterface[]) {
        try {
            for(const channel of ipcChannels) {
                ipcMain.handle(channel.getName(), async (event, request) => await channel.handleInvoke(event, request))
            }
        } catch (err) {
            log.error(`Unable to register IPC channels: ${err.message}`, err);
        }
    }

I Renderer.js-filen:

import electron from 'electron';
sendMessage(msg) {
        let ipc = electron.ipcRenderer;
        ipc.invoke(channelName, msg);
}

Jag förstår inte varför det fungerar helt felfritt på MacOS men inte på Windows. Jag följde dokumentationen för att implementera handle/invoke i Electron-appen. Miljöinformation: Electron - v8.5.2 Nodejs - v12.16.1 OS - Windows 10

Observera: Detta händer endast vid första uppstarten. Efter uppdatering eller att stänga och öppna appen igen fungerar det bra

Kan någon hjälpa till att ta reda på varför detta problem uppstår?

Svar #1

Jag hade samma problem. Mitt problem var att jag instruerade Electron att navigera till min app innan mina IPC-hanterare registrerades. Anledningen till att det bara hände vid första laddningen och inte vid efterföljande laddningar/återladdningar (och hot-reloads) var att BrowserWindow åter skapades och mina IPC-hanterare redan var registrerade (och återregistrerades i min kod).

Så var helt säker på att dina handlare registreras innan BrowserWindow laddar renderarkoden som anropar IPC-kanalerna.

Svar #2

Observera: Detta händer endast vid första gången appen startas. Efter uppdatering eller när du avslutar och öppnar appen igen fungerar det som det ska

Det beror på att när du startar electron använder det de sparade inställningarna och koderna i huvudprocessen. Om du ändrar en kod i huvudprocessen måste du avsluta appen och starta om för att ändringarna i huvudprocesskoden ska träda i kraft

Jag hoppas att informationen ovan sparar någons tid!

Relaterade artiklar