在电子中,我遇到以下错误:
module.js:440
throw err;
^
Error: Cannot find module '../dialog'
at Module._resolveFilename (module.js:438:15)
at Function.Module._resolveFilename (/opt/App/resources/electron.asar/common/reset-search-paths.js:47:12)
at Function.Module._load (module.js:386:25)
at Module.require (module.js:466:17)
at require (internal/module.js:20:19)
at Object.get [as dialog] (/opt/App/resources/electron.asar/browser/api/exports/electron.js:35:14)
at process.<anonymous> (/opt/App/resources/electron.asar/browser/init.js:64:31)
at emitOne (events.js:96:13)
at process.emit (events.js:188:7)
at process._fatalException (node.js:276:26)
它发生在Linux上失败的子进程spawn中。奇怪,因为我确实有一个try catch块,但它仍然会产生一个uncaughtexception,如来自electron.asar的browser / init.js中的代码所示:
// Don't quit on fatal error.
process.on('uncaughtException', function (error) {
// Do nothing if the user has a custom uncaught exception handler.
var dialog, message, ref, stack
if (process.listeners('uncaughtException').length > 1) {
return
}
// Show error in GUI.
dialog = require('electron').dialog
stack = (ref = error.stack) != null ? ref : error.name + ': ' + error.message
message = 'Uncaught Exception:\n' + stack
dialog.showErrorBox('A JavaScript error occurred in the main process', message)
}
如上所述,我的代码是试一试:
try {
server = childProcess.spawn(java, ["-jar", "App.jar"], {
"cwd": serverDirectory,
"detached": true
}, function(err) {
console.log("in callback");
});
} catch (err) {
console.log("here we are");
console.log(err);
}
但是没有达到回调和catch块。任何想法在这里发生了什么以及无法找到默认对话框模块的原因?
答案 0 :(得分:0)
我希望我能正确理解你的问题......
如果通过“默认对话框模块”,您指的是电子对话框API,那么您可以这样要求:const { dialog } = require('electron')
。 (或者在1.0之前的版本中只需require('dialog')
。请参阅https://github.com/electron/electron/blob/master/docs/api/dialog.md
此外,try / catch需要围绕子进程中的require。您拥有的try / catch是围绕父进程中子进程的产生。这种要求在完全不同的node.js进程中失败,因此它不会在生成它的父进程中捕获。听起来您的子进程代码可能会更好,如果它看起来像:
try {
const dialog = require('dialog');
} catch(e) {}
此外,如果childProcess.spawn
指的是核心节点模块child_process
,则它不接受回调函数。见https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options
您可以分享子流程中的代码吗?这可能会有所帮助。
答案 1 :(得分:0)
我在electron 1.6.2
想到它是应该的,当关闭应用程序时发生错误并且电子想要在对话框中显示它,也许关闭过程已经开始并且电子无法加载该模块,无论如何我添加:
const { dialog } = require('electron');
在main.js
中,在控制台中没有更多的错误而是错误的对话框,我可以修复它,之后我会以不需要的方式提出要求。