admin管理员组

文章数量:1435859

I am working on an Electron.js application and trying to pass a token from the main process to the renderer process using ipcMain and ipcRenderer. However, when I attempt to log the received data in the renderer, it logs undefined.

ipcMain.on(IPC_ACTIONS.RECEIVE_TOKEN, async (event) => {
    if (mainWindow) {
        try {
            const response = await fetch(";, {
                method: "POST",
                headers: {
                    "Content-Type": "application/json",
                },
            });

            const data: { token?: string } = await response.json();
            console.log("API response in main process:", data); 
    correctly, e.g., { token: "your-token-here" }

            if (data && data.token) {
                event.reply(IPC_ACTIONS.RECEIVE_TOKEN, { token: data.token });
            } else {
                event.reply(IPC_ACTIONS.RECEIVE_TOKEN, { error: "Token not received from the server" });
            }
        } catch (error) {
            console.error("Error during API call:", error);
            event.reply(IPC_ACTIONS.RECEIVE_TOKEN, { error: error.message });
        }
    }
});

const ipcRenderer = (window as any).ipcRenderer;
const navigate = useNavigate();

ipcRenderer.on(IPC_ACTIONS.RECEIVE_TOKEN, (event: any, payload: any) => {
    console.log("Full payload received from main process:", payload);

    if (payload && payload.token) {
        console.log("Token received in renderer:", payload.token);
    } else if (payload && payload.error) {
        console.error("Error received:", payload.error);
    } else {
        console.error("Unexpected response received from main process:", payload);
    }
});

const handleButtonClick = () => {
    ipcRenderer.send(IPC_ACTIONS.RECEIVE_TOKEN);
    
};

Even though the console.log("API response in main process:", data); in the main process prints a valid token (e.g., { token: "your-token-here" }), the console.log("Full payload received from main process:", payload); in the renderer process logs undefined

I am working on an Electron.js application and trying to pass a token from the main process to the renderer process using ipcMain and ipcRenderer. However, when I attempt to log the received data in the renderer, it logs undefined.

ipcMain.on(IPC_ACTIONS.RECEIVE_TOKEN, async (event) => {
    if (mainWindow) {
        try {
            const response = await fetch("http://example/generate-token", {
                method: "POST",
                headers: {
                    "Content-Type": "application/json",
                },
            });

            const data: { token?: string } = await response.json();
            console.log("API response in main process:", data); 
    correctly, e.g., { token: "your-token-here" }

            if (data && data.token) {
                event.reply(IPC_ACTIONS.RECEIVE_TOKEN, { token: data.token });
            } else {
                event.reply(IPC_ACTIONS.RECEIVE_TOKEN, { error: "Token not received from the server" });
            }
        } catch (error) {
            console.error("Error during API call:", error);
            event.reply(IPC_ACTIONS.RECEIVE_TOKEN, { error: error.message });
        }
    }
});

const ipcRenderer = (window as any).ipcRenderer;
const navigate = useNavigate();

ipcRenderer.on(IPC_ACTIONS.RECEIVE_TOKEN, (event: any, payload: any) => {
    console.log("Full payload received from main process:", payload);

    if (payload && payload.token) {
        console.log("Token received in renderer:", payload.token);
    } else if (payload && payload.error) {
        console.error("Error received:", payload.error);
    } else {
        console.error("Unexpected response received from main process:", payload);
    }
});

const handleButtonClick = () => {
    ipcRenderer.send(IPC_ACTIONS.RECEIVE_TOKEN);
    
};

Even though the console.log("API response in main process:", data); in the main process prints a valid token (e.g., { token: "your-token-here" }), the console.log("Full payload received from main process:", payload); in the renderer process logs undefined

Share Improve this question asked Nov 15, 2024 at 21:30 Denis OumaDenis Ouma 1231 silver badge5 bronze badges
Add a comment  | 

2 Answers 2

Reset to default 0

You should send the request not to receive it.

const handleButtonClick = () => {
    ipcRenderer.send(IPC_ACTIONS.REQUEST_TOKEN);  // Change to REQUEST_TOKEN
};

The IPC_ACTIONS.REQUEST_TOKEN is used to request the token from the main process and listens for IPC_ACTIONS.RECEIVE_TOKEN to receive the token or error.

I found a solution for using two-way IPC communication between the renderer and main processes in Electron. The approach is to use ipcRenderer.invoke and ipcMain.handle, which provide a promise-based communication pattern. This is how I implemented it

Main Process Code In the main process (main.ts), I used ipcMain.handle to handle the request from the renderer,

ipcMain.handle('REQUEST_TOKEN', async (event) => {
    try {
        const response = await fetch('http://example/generate-token', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
        });

        const data: { token?: string } = await response.json();
        console.log('API response in main process:', data);

        if (data && data.token) {
            return { token: data.token };
        } else {
            throw new Error('Token not received from the server');
        }
    } catch (error) {
        console.error('Error during API call:', error);
        return { error: error.message };
    }
});

const handleButtonClick = async () => {
    try {
        const response = await ipcRenderer.invoke('REQUEST_TOKEN');
        console.log('Full payload received from main process:', response);

        if (response && response.token) {
            console.log('Token received in renderer:', response.token);
            
        } else if (response && response.error) {
            console.error('Error received:', response.error);
        } else {
            console.error('Unexpected response received from main process:', response);
        }
    } catch (error) {
        console.error('Error invoking main process:', error);
    }
};

[Documentation Reference electronjs][1]

[1]: https://www.electronjs./docs/latest/tutorial/ipc#:~:text=In%20Electron%2C%20processes%20communicate%20by,channel%20name%20for%20both%20modules).

本文标签: