如何修复 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 请求函数时出现。我还尝试使用请求的对象版本及其字符串版本发送请求,因此 body
和 body2
.
我不知道我错过了什么,我非常接近将 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;
}
);
整个错误信息如下:
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 请求函数时出现。我还尝试使用请求的对象版本及其字符串版本发送请求,因此 body
和 body2
.
我不知道我错过了什么,我非常接近将 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;
}
);