Electron调用session时报Cannot read properties of undefined (reading 'session')错误如何解决
问题根因
session是Electron主进程专属API,无法在渲染进程上下文中直接调用,你在渲染进程代码里直接引入session必然返回undefined,触发该类型错误。
具体解决方案
1. 主进程代码配置
在主进程入口(通常为main.js)中监听IPC事件,处理cookie写入逻辑:
const { app, session, ipcMain } = require('electron') const path = require('path') // 必须等待app ready后再操作session app.whenReady().then(() => { // 监听渲染进程发送的设置cookie请求 ipcMain.handle('set-cookie', async (event, cookieParams) => { try { // 注意url必须是完整路径,不能用相对路径,此处示例为file协议加载本地文件的场景 const baseUrl = `file://${path.resolve(__dirname, './')}` await session.defaultSession.cookies.set({ url: baseUrl, ...cookieParams }) return { success: true } } catch (err) { return { success: false, error: err.message } } }) // 此处保留你原有创建窗口等业务逻辑 // ... })
2. 预加载脚本(preload.js)配置
Electron 12+默认开启上下文隔离,需要通过预加载脚本向渲染进程暴露安全的IPC调用接口:
const { contextBridge, ipcRenderer } = require('electron') contextBridge.exposeInMainWorld('electronAPI', { setCookie: (cookieParams) => ipcRenderer.invoke('set-cookie', cookieParams), sendUpdatePatientWindow: () => ipcRenderer.send('updatePatientWindow') })
创建窗口时要指定对应预加载脚本:
// 主进程创建窗口的代码示例 const mainWindow = new BrowserWindow({ webPreferences: { preload: path.join(__dirname, 'preload.js'), // 不要关闭上下文隔离、不要开启nodeIntegration,避免安全问题 contextIsolation: true, nodeIntegration: false } })
3. 渲染进程代码修改
调整原有渲染进程代码,调用预加载脚本暴露的接口即可:
async function updatePatient(id) { // 调用接口设置cookie const result = await window.electronAPI.setCookie({ name: 'patientId', value: id }) if (result.success) { window.electronAPI.sendUpdatePatientWindow() } else { console.error('cookie设置失败:', result.error) } } updatePatient(id)
注意事项
- 操作
session.defaultSession必须等待app.whenReady()触发后执行,否则主进程也会出现session为undefined的问题 - cookie的
url参数必须和你应用加载页面的实际地址、协议完全匹配,否则设置的cookie不会生效 - 不要为了方便关闭上下文隔离或开启nodeIntegration,会引入严重的安全风险
内容的提问来源于stack exchange,提问作者mvioole
相关产品推荐
相关产品推荐

