找不到模块' ../ dialog' (电子致命错误)

时间:2016-06-14 09:37:39

标签: node.js npm 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上失败的子进程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块。任何想法在这里发生了什么以及无法找到默认对话框模块的原因?

2 个答案:

答案 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中,在控制台中没有更多的错误而是错误的对话框,我可以修复它,之后我会以不需要的方式提出要求。