Google不到报错信息的两种情况

林一二2020年04月09日 11:37

我使用 preload script 来在 electron 的主线程和渲染线程之间通信:

preload.js:

import { contextBridge, ipcRenderer } from 'electron';

contextBridge.exposeInMainWorld('sync', {
  fromAnkiDB: ankiDBPath => ipcRenderer.invoke('syncFromAnkiDB', ankiDBPath),
});

handlers.js:

// @flow
import { ipcMain } from 'electron';

import { getAnkiMetadata } from '../../libs/sync/ankiSqliteImporter';

ipcMain.handle(
  'syncFromAnkiDB',
  async (event, ankiDBPath: string = '/Users/linonetwo/Library/Application Support/Anki2/林一二/collection.anki2') => {
    const deskNames = getAnkiMetadata(ankiDBPath);
    return deskNames;
  },
);

但是我写完一大堆代码,志在必得地启动应用后,却收到报错:

Error invoking remote method "syncFromAnkiDB" No handler registered for "syncFromAnkiDB"

我想,是不是因为我用 babel-register 来在 handlers.js 里使用 import,(这时候我还没把 preload.js 重构成用 import,它还在用 require('electron') )所以两边引用的是两个不同的 electron 实例?于是我就动手把它也重构成 import 。但是问题还在。

我就想,是不是新版的 electron API 变化了?于是我重装了 electron ,还顺便升级了 node-gyp,但是问题还在。

我还在网上一直搜,但是就是搜不到关于这条报错的问题。这其实就意味着:

1. 这是最新的 bug,但 electron 最近的更新好像没有提到这方面的 API 变化 2. 这不是个常见的 bug,一般只出现在用错 API 或者特殊用法上

这时候我把鼠标放在 ipcRenderer.invoke 上,tooltip 显示说,我应该用 ipcMain.handle 而不是我之前用的 ipcMain.invoke!,原来是我用错了 API 呀,两个文件里的 API 要两两配对的!