如何修复 Electron 中的 IPC 错误 "Error invoking remote method, an object could not be cloned"?

How can I fix IPC error "Error invoking remote method, an object could not be cloned" in Electron?

整个错误信息如下:

Error: Error invoking remote method 'MY-IPC-CHANNEL': Error: An object could not be cloned. at EventEmitter.o.invoke (electron/js2c/renderer_init.js:71)

electron/js2c/renderer_init.js:71 行不是我的原始代码行,而是编译后的代码行。

我正在尝试发送 POST 请求以获得我的 Google 访问令牌,以便我可以使用 Google Drive 的 API。目前,我一直在尝试通过向主进程提供我从 Google 获得的代码并使其向 auth 服务器发送 POST 请求来尝试在渲染器进程和主进程之间进行通信。我在建立连接时没有问题,但是当我在发送 HTTP 请求时尝试建立连接时,出现了上述错误。

// ******* MAIN *******
function exchangeCodeForAccessToken(code: string) {
    const clientID = "My Google client ID";
    const clientSecret = "My Google client secret";
    const body = {
      code: code,
      client_id: clientID,
      client_secret: clientSecret,
      redirect_uri: "http://localhost:4000",
      grant_type: "authorization_code",
    };
    const body2 = `code=${code}&
    client_id=${clientID}&
    client_secret=${clientSecret}&
    grant_type=authorization_code`;

  // return fetch("https://oauth2.googleapis.com/token", {
  //   method: "POST",
  //   body: body
  // });

    return axios.post("https://oauth2.googleapis.com/token", body);
}

这是主句柄:

// ******* MAIN *******
ipcMain.handle(
  OAUTH2_ACCESS_TOKEN_REQUEST_CHANNEL,
  async (event, code: string) => await exchangeCodeForAccessToken(code)
);

渲染器调用函数:

// ******* RENDERER *******
function exchangeCodeForAccessToken(code: string) {
  ipcRenderer.invoke(OAUTH2_ACCESS_TOKEN_REQUEST_CHANNEL, code).then((response) => {
    console.log(response);
  }).catch((error) => {
        //TODO Improve error handling
        console.log(error);
    });
}

我尝试通过 Electron 的 net 模块发送请求。我还尝试了 electron-fetch 模块,它应该是 Node 的 fetch 模块的 Electron 集成版本。最后我尝试使用 axios 模块,但它一直抛出相同的错误。我认为它与通过 IPC 进行对象序列化有关,但后来我尝试只使用该函数而不返回其承诺,并且不断弹出相同的错误。这意味着错误不仅在返回承诺时出现,而且在调用 HTTP 请求函数时出现。我还尝试使用请求的对象版本及其字符串版本发送请求,因此 bodybody2.

我不知道我错过了什么,我非常接近将 Google 登录集成到我的桌面应用程序中。

I thought it had something to do with object serialization through IPC but then I tried just using the function without returning its promise and the same error kept popping up.

IPC错误。您正在返回完整的响应对象,其中可能包含一些具有方法 and/or 其他不可克隆值的属性。您需要确保返回值可以被克隆并发送到渲染器,例如:

ipcMain.handle(
  OAUTH2_ACCESS_TOKEN_REQUEST_CHANNEL,
  async (event, code) => {
    const response = await exchangeCodeForAccessToken(code);
    const {status, data} = response;
    return {status, data};
  }
);

我不确定您在尝试修复此问题时是如何调用该函数的,但我只是 运行 在 Electron 中使用它并且它可以正常工作。

编辑:假设 response 来自 fetch 调用(如果数据为 JSON,则使用 response.json()):

ipcMain.handle(
  OAUTH2_ACCESS_TOKEN_REQUEST_CHANNEL,
  async (event, code) => {
    const response = await exchangeCodeForAccessToken(code);
    const data = await response.text();
    return data;
  }
);