为什么我的 IPC 通信不能正常工作?
Why my IPC communication doesn't work properly?
这是一个使用 Electron 构建的简单视频时长检查程序。但是,它没有按预期工作;我也尝试在其他项目中使用Electron IPC通信,但总是失败。
我可以成功上传视频并提交,之后什么都没有发生,任何错误或建议。调试器也没有显示任何内容。我从零开始构建了一个新项目并遇到了同样的问题。路径值也未显示在控制台上
main.js:
const electron = require('electron'),
app = electron.app,
BrowserWindow = electron.BrowserWindow
const ffmpeg = require('fluent-ffmpeg')
const ipc = require('electron').ipcMain
let mainWindow
app.on('ready', () => {
mainWindow = new BrowserWindow({})
mainWindow.loadFile('./index.html')
})
ipc.on('video:submit', (event, path) => {
ffmpeg.ffprobe(path, (metadata) => {
event.returnValue = metadata.format.duration
})
})
index.html:
<html>
<head>
</head>
<body>
<form id="form">
<h1>Video Info</h1>
<div>
<label>Select a video</label>
<input type="file" accept="video/*" id="input">
</div>
<button type="submit" id="sb">Get info</button>
<div id="result"></div>
</form>
</body>
<script>
require('./renderer.js')
</script>
</html>
renderer.js:
const ipc = require('electron').ipcRenderer,
form = document.querySelector('#form')
let result = document.querySelector('#result')
console.log(path)
form.addEventListener('submit', () => {
const path = document.querySelector('#input').files[0].path
let reply = ipc.sendSync('video:submit', path)
result.innerHTML = 'Video is' + reply + 'seconds!'
})
编辑
我对 main 和 renderer 进行了一些更改以使用异步发送和回复。我没有得到我想要的,但是在提交一些内容后,它的名称被替换为"No file chosen"。路径值仍未打印。
main.js 的变化:
ipc.on('video:submit', (event, path) => {
ffmpeg.ffprobe(path, (metadata) => {
let duration = metadata.format.duration
event.reply('duration', duration)
})
})
renderer.js 的变化:
form.addEventListener('submit', () => {
const path = document.querySelector('#input').files[0].path
ipc.on('duration', (event, duration) => {
console.log(duration)
})
ipc.send('video:submit', path)
result.innerHTML = 'Video is' + duration + 'seconds!'
})
代码看起来不错,但我想问题出在您的表单提交上。该页面应在提交时重新加载,但未到达 IPC 发送
称呼。尝试阻止表单的默认操作。
form.addEventListener('submit', (e) => {
e.preventDefault()
const path = document.querySelector('#input').files[0].path
ipc.on('duration', (event, duration) => {
console.log(duration)
})
ipc.send('video:submit', path)
result.innerHTML = 'Video is' + duration + 'seconds!'
})
已解决!有 3 个主要错误,所以我不知道到底发生了什么。但他们在这里:
1 - ipc 函数的制作方式有误。这是正确的(异步回复):
renderer.js:
ipc.on('duration', (event, duration) => {
result.innerHTML = `Video is ${duration} seconds!`
})
ipc.send('video:submit', path)
main.js:
ipc.on('video:submit', (event, path) => {
ffmpeg.ffprobe(path, (err, metadata) => {
let duration = metadata.format.duration
console.log(duration)
event.reply('duration', duration)
})
})
2 - DOM 没有获取提交按钮或事件,所以 "addEventListiner" 变为空...我将提交按钮更改为具有相同 ID 的输入按钮,然后将提交事件更改为简单的点击事件.我查询选择了输入按钮而不是表单。这就是我最终得到的:
renderer.js:
const ipc = require('electron').ipcRenderer,
suBtn = document.querySelector('input#sb')
let result = document.querySelector('div#result')
suBtn.addEventListener('click', (event) => {
event.preventDefault()
const path = document.querySelector('input#file').files[0].path
ipc.on('duration', (event, duration) => {
result.innerHTML = `Video is ${duration} seconds!`
})
ipc.send('video:submit', path)
})
3 - 在 main.js 的 ffprobe 进程中,我使用错误的参数调用了方法。需要先传err参数,再传data参数,这样:
main.js:
ffmpeg.ffprobe(path, (err, metadata) => {
let duration = metadata.format.duration
console.log(duration)
event.reply('duration', duration)
})
这是一个使用 Electron 构建的简单视频时长检查程序。但是,它没有按预期工作;我也尝试在其他项目中使用Electron IPC通信,但总是失败。 我可以成功上传视频并提交,之后什么都没有发生,任何错误或建议。调试器也没有显示任何内容。我从零开始构建了一个新项目并遇到了同样的问题。路径值也未显示在控制台上
main.js:
const electron = require('electron'),
app = electron.app,
BrowserWindow = electron.BrowserWindow
const ffmpeg = require('fluent-ffmpeg')
const ipc = require('electron').ipcMain
let mainWindow
app.on('ready', () => {
mainWindow = new BrowserWindow({})
mainWindow.loadFile('./index.html')
})
ipc.on('video:submit', (event, path) => {
ffmpeg.ffprobe(path, (metadata) => {
event.returnValue = metadata.format.duration
})
})
index.html:
<html>
<head>
</head>
<body>
<form id="form">
<h1>Video Info</h1>
<div>
<label>Select a video</label>
<input type="file" accept="video/*" id="input">
</div>
<button type="submit" id="sb">Get info</button>
<div id="result"></div>
</form>
</body>
<script>
require('./renderer.js')
</script>
</html>
renderer.js:
const ipc = require('electron').ipcRenderer,
form = document.querySelector('#form')
let result = document.querySelector('#result')
console.log(path)
form.addEventListener('submit', () => {
const path = document.querySelector('#input').files[0].path
let reply = ipc.sendSync('video:submit', path)
result.innerHTML = 'Video is' + reply + 'seconds!'
})
编辑
我对 main 和 renderer 进行了一些更改以使用异步发送和回复。我没有得到我想要的,但是在提交一些内容后,它的名称被替换为"No file chosen"。路径值仍未打印。
main.js 的变化:
ipc.on('video:submit', (event, path) => {
ffmpeg.ffprobe(path, (metadata) => {
let duration = metadata.format.duration
event.reply('duration', duration)
})
})
renderer.js 的变化:
form.addEventListener('submit', () => {
const path = document.querySelector('#input').files[0].path
ipc.on('duration', (event, duration) => {
console.log(duration)
})
ipc.send('video:submit', path)
result.innerHTML = 'Video is' + duration + 'seconds!'
})
代码看起来不错,但我想问题出在您的表单提交上。该页面应在提交时重新加载,但未到达 IPC 发送 称呼。尝试阻止表单的默认操作。
form.addEventListener('submit', (e) => {
e.preventDefault()
const path = document.querySelector('#input').files[0].path
ipc.on('duration', (event, duration) => {
console.log(duration)
})
ipc.send('video:submit', path)
result.innerHTML = 'Video is' + duration + 'seconds!'
})
已解决!有 3 个主要错误,所以我不知道到底发生了什么。但他们在这里:
1 - ipc 函数的制作方式有误。这是正确的(异步回复):
renderer.js:
ipc.on('duration', (event, duration) => {
result.innerHTML = `Video is ${duration} seconds!`
})
ipc.send('video:submit', path)
main.js:
ipc.on('video:submit', (event, path) => {
ffmpeg.ffprobe(path, (err, metadata) => {
let duration = metadata.format.duration
console.log(duration)
event.reply('duration', duration)
})
})
2 - DOM 没有获取提交按钮或事件,所以 "addEventListiner" 变为空...我将提交按钮更改为具有相同 ID 的输入按钮,然后将提交事件更改为简单的点击事件.我查询选择了输入按钮而不是表单。这就是我最终得到的:
renderer.js:
const ipc = require('electron').ipcRenderer,
suBtn = document.querySelector('input#sb')
let result = document.querySelector('div#result')
suBtn.addEventListener('click', (event) => {
event.preventDefault()
const path = document.querySelector('input#file').files[0].path
ipc.on('duration', (event, duration) => {
result.innerHTML = `Video is ${duration} seconds!`
})
ipc.send('video:submit', path)
})
3 - 在 main.js 的 ffprobe 进程中,我使用错误的参数调用了方法。需要先传err参数,再传data参数,这样:
main.js:
ffmpeg.ffprobe(path, (err, metadata) => {
let duration = metadata.format.duration
console.log(duration)
event.reply('duration', duration)
})