gpt4 book ai didi

node.js - ipcMain : event. 回复不是函数

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:36 24 4
gpt4 key购买 nike

我制作了一个简单的 Electron 应用程序,它使用 ipcMainipcRenderer。这是代码,这是有道理的:

main.js

const { app, BrowserWindow, ipcMain } = require('electron')
const { spawn, exec } = require('child_process')

let win

function createWindow() {
win = new BrowserWindow({
width: 800,
height: 600,
minWidth: 610,
minHeight: 470,
webPreferences: {
nodeIntegration: true
}
})

win.loadFile('index.html')
win.webContents.openDevTools()
}

app.on('ready', createWindow)

ipcMain.on("checkPerl", function(e){
tryToRun("perl", ["-v"])
.then(function(){ e.reply("checkPerlReply", true) })
.catch(function(){ e.reply("checkPerlReply", false) })

})

function tryToRun(cmd, args){
return new Promise(function(resolve, reject){
// some code
})
}

renderer.js

const { ipcRenderer } = require('electron')

class Chdump {

checkPerl(){
this.message("Проверяем Perl...")
let p = new Promise(function(resolve, reject){
ipcRenderer.send("checkPerl", true)
ipcRenderer.on("checkPerlReply", function(event, res){
if (res) resolve()
else reject()
})
})
return p
}

start(){
let self = this
this.checkPerl()
.then(function(){ console.log("Perl is installed") })
.catch(function(){ console.log("Perl is not installed") })
}
}

let app = new Chdump()
app.start()

我跳过了一些与问题无关的代码。当我使用 NodeJS 使用 electron . 运行此代码时,此代码运行正常,但在打包应用程序后,我收到以下错误:

UnhandledPromiseRejectionWarning: TypeError: e.reply is not a function

此错误引用了 main.js 中的以下字符串:

    tryToRun("perl", ["-v"])
.then(function(){ e.reply("checkPerlReply", true) })
.catch(function(){ e.reply("checkPerlReply", false) })

我添加了 console.log(e) 来查看事件对象并获得以下内容:

{ preventDefault: [Function: preventDefault],
sender:
WebContents {
webContents: [Circular],
history:
[ 'file:///home/kolesnikov/changedump/resources/app/index.html' ],
currentIndex: 0,
pendingIndex: -1,
inPageIndex: -1,
_events:
{ 'navigation-entry-commited': [Function],
'ipc-message': [Function],
'ipc-message-sync': [Function],
'pepper-context-menu': [Function],
'-did-get-response-details': [Function],
'-did-get-redirect-request': [Function],
'devtools-reload-page': [Function],
'-new-window': [Function],
'-web-contents-created': [Function],
'-add-new-contents': [Function],
'will-navigate': [Function],
'did-navigate': [Function],
destroyed: [Function],
'devtools-opened': [Function],
move: [Function],
activate: [Function],
'page-title-updated': [Function] },
_eventsCount: 17,
_maxListeners: 0,
browserWindowOptions:
{ width: 800,
height: 600,
minWidth: 610,
minHeight: 470,
webPreferences: [Object] } } }

我尝试对使用 NodeJS 运行的非打包应用程序执行相同的操作,但得到了令人惊讶的不同结果:

{ preventDefault: [Function: preventDefault],
// [...] looks the same as a previous object
frameId: 1,
reply: [Function] }

第二个 Event 对象看起来不错,并且它有一个 reply 属性。我还是不明白,为什么 electron Event 对象在打包后没有 reply 属性。

你有什么想法吗?

最佳答案

使用 e.sender.send 代替 e.reply

ipcMain.on("checkPerl", function(e){
tryToRun("perl", ["-v"])
.then(function(){ e.sender.send("checkPerlReply", true) })
.catch(function(){ e.sender.send("checkPerlReply", false) })

})

关于node.js - ipcMain : event. 回复不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57038073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com