Electron中ipcMain.handle无法正确获取传入的数据库URL参数,仅收到元数据对象
Electron中ipcMain.handle无法正确获取传入的数据库URL参数,仅收到元数据对象
嗨,我看到你遇到了Electron IPC通信里参数获取的问题,别着急,这其实是个很常见的小疏忽!
问题出在ipcMain.handle的回调函数参数定义上:当你使用ipcMain.handle注册调用处理函数时,第一个参数永远是IpcMainInvokeEvent对象(也就是你现在打印出来的包含sender、frameId这些元数据的对象),而你真正传入的业务参数是从第二个位置开始的。
看你的main.js代码,现在的回调函数只写了async (database),这里的database其实接收到的是那个事件对象,而不是前端传递的数据库URL。
修复方案:修改main.js中的处理函数
把回调的参数改成(event, database),这样第二个参数才是你要的数据库URL:
ipcMain.handle('run-start', async (event, database) => { console.log(`dbUrl in main.js:`, JSON.stringify(database), `Type:`, typeof database); const command = path.join(filePath, 'dist', 'setup.bat') + ' ' + database try { console.log(command) const result = await new Promise((resolve, reject) => { exec(command, (error, stdout, stderr) => { if (error) { reject(`Error: ${stderr}`); } else { resolve(stdout); } }); }); return result; } catch (error) { return error; } })
其他代码的小优化
顺便提一下你的preload.js里的runStart方法,现在的写法有点小瑕疵,改成下面这样会更规范(要返回ipcRenderer.invoke的Promise,这样前端的await才能正确等待调用完成):
runStart: (dbUrl) => { console.log(dbUrl); return ipcRenderer.invoke('run-start', dbUrl); }
你的index.html里的调用逻辑是没问题的,await window.electron.runStart(dbUrl)能正确传递参数,只要main端修正了参数位置,就能拿到正确的数据库URL了。
修改完之后再测试一下,你会发现console.log里的database就是你期望的URL了,拼接命令也能正常工作~
备注:内容来源于stack exchange,提问作者WoutNerd
相关产品推荐
相关产品推荐

