无法找到模块'../dialog'(Electron致命错误)

3
在 Electron 中,我遇到了以下错误:
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中,当一个子进程生成失败时会发生这种情况。很奇怪,因为我确实在这周围有一个try catch块,但它仍然导致一个未捕获的异常,正如在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 catch实现:
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);
}

但是无论是回调函数还是捕获块都没有被执行。有什么想法,这里发生了什么以及为什么找不到默认的对话框模块?

2个回答

1
我发现与electron 1.6.2相同的错误。
我认为是因为当关闭应用程序时出现错误,而electron想要在对话框中显示它。也许关闭过程已经开始,而electron无法加载该模块。无论如何,我添加了:
const { dialog } = require('electron');

main.js中,控制台不再显示错误,而是弹出一个对话框来显示错误,我可以修复它。之后我让require留在那里以防万一。

0

希望我正确理解了你的问题...

如果你所说的“默认对话框模块”是指electron对话框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是放在父进程中生成子进程的代码周围。而require失败是在一个完全不同的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 你能分享一下你的子进程代码吗?这可能会更有帮助。

嗨,我自己不需要对话框。这是在electron.asar中的browser/init.js发生的--由于某个未捕获的异常,electron试图显示一个对话框但无法加载对话框模块,因此出现了错误。我之前使用spawn的回调是因为它之前是一个exec语句,是的,我可以去掉那个。我不确定你说的在其他地方使用try catch是什么意思?childProcess变量的require语句是在页面的顶部;const childProcess = require("child_process"); - user429620
子进程本身是一个Java可执行文件。但是,我还有server.stderr.on("data", function() {})等回调函数。整个过程都在try catch块中。 - user429620

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接