Javascript 在electron中使用AudioWorklet(DomeException:用户中止了请求)

Javascript 在electron中使用AudioWorklet(DomeException:用户中止了请求),javascript,electron,web-audio-api,Javascript,Electron,Web Audio Api,我正在尝试在我的electron应用程序中使用AudioWorklet进行计量等。当在开发模式下执行时,工作集由express dev服务器提供服务,如。 但是,如果我尝试在prod模式下运行应用程序,则文件会像file://tmp/etc/etc/build/processor.js 在开发人员控制台中,我甚至可以看到正确预览的文件,但我收到以下错误消息: 未捕获(承诺中)DomeException:用户中止了一个请求 我以前看到其他人也有类似的问题,但不幸的是,我在堆栈溢出方面的声誉不高,无

我正在尝试在我的electron应用程序中使用AudioWorklet进行计量等。当在开发模式下执行时,工作集由express dev服务器提供服务,如。 但是,如果我尝试在prod模式下运行应用程序,则文件会像file://tmp/etc/etc/build/processor.js 在开发人员控制台中,我甚至可以看到正确预览的文件,但我收到以下错误消息:

未捕获(承诺中)DomeException:用户中止了一个请求

我以前看到其他人也有类似的问题,但不幸的是,我在堆栈溢出方面的声誉不高,无法直接发表评论。建议将mime类型更改为application/javascript或text/javascript听起来不错,但我不知道如何强制electron对特定文件使用特定的mime类型。此外,在网络选项卡的开发者控制台中,chromium似乎已经为my processor.js假设了一个javascript文件

我已经尝试用这样的自定义协议加载工作集

protocol.registerStandardSchemes(['worklet']);

app.on('ready', () => {
  protocol.registerHttpProtocol('worklet', (req, cb) => {
    fs.readFile(req.url.replace('worklet://', ''), (err, data) => {
      cb({ mimeType: 'text/javascript', data });
    });
  });
});
然后在添加工作集时

await ctx.audioWorklet.addModule('worklet://processor.js');
不幸的是,这只会以这些错误结束,然后是第一个错误

得到worklet://processor.js/ 0()
未捕获错误:您提供的错误不包含堆栈跟踪。

如果有人感兴趣的话,我找到了一个黑客解决方案。 为了强制使用mime类型electron/chromium,我将文件api作为字符串加载工作集文件,将其转换为带有mime类型text/javascript的blob,然后从中创建一个对象url

const processorPath = isDevMode ? 'public/processor.js' : `${global.__dirname}/processor.js`;
const processorSource = await readFile(processorPath); // just a promisified version of fs.readFile
const processorBlob = new Blob([processorSource.toString()], { type: 'text/javascript' });
const processorURL = URL.createObjectURL(processorBlob);
await ctx.audioWorklet.addModule(processorURL);

希望这能帮助任何有同样问题的人…

如果您使用webpack编译您的源代码,您应该能够将用于自定义工作脚本。

回答得很好!我曾经启动一个本地HTTP服务器,为音频工作集提供正确的mime类型集,但您的解决方案更简单(而且加载速度更快,占用的资源更少)。考虑到问题的性质,我觉得这并不是一个很老套的解决方案。它可以工作,而且也不是那么容易侵入。我想这是不可能的,因为AudioWorklet不是一个普通的工作程序。