我目前正在使用NPM开发Electron-App,该应用程序将文件解压缩到所选目录。基本上是安装程序。现在,当我构建应用程序时,它仍然可以正常工作。我只是在win-packed文件夹中启动setup.exe,一切顺利进行。现在,当我将win-unpacked文件夹移动到另一个目录时,我的应用程序可以正常运行,但是当它开始解压缩过程时,它将引发以下错误:
我已经注意到,显示的第一个文件路径(由于某种原因)没有使用utf8,但是所有其他文件都被正确显示了(应该是ä)。另外,我已经准备好尝试删除node_modules文件夹,然后运行npm i重新安装它们。仍然有同样的问题。
以下是开始解压缩过程的代码:
const path = require('path');
const ipcRenderer = require('electron').ipcRenderer;
const Unzip = require('./unzip');
const os = require('os');
const fs = require('fs');
$('#information_next').click(function () {
var extractPath = $('#input_select').val();
let filepath;
const platform = os.platform();
const nodeName = platform == 'win32' ? 'wcd.node' : (platform == 'darwin' ? 'mcd.node' : 'lcd.node');
let customData = require("bindings")(nodeName);
let zip = h2a(customData.customData());
if(os.platform() == 'darwin') {
filepath = path.join(__dirname, '..', '..', '..', '..', 'ZIP.zip');
} else {
filepath = path.join(__dirname, '..', '..', 'ZIP.zip');
}
var xPath = path.join.apply(null, extractPath.split('\\'));
var unzip = new Unzip(filepath, xPath.toString());
unzip.extract(extractPath, zip, 100, (percentage) => {
// Code for Progressbar
finish = true;
setTimeout(function () {
$('.main_wrapper').addClass('hidden');
$('.main7').removeClass('hidden');
}, 1500);
}).catch((e) => {
$('.main6').addClass('hidden');
$('.main_install_error').prop('hidden', false);
});
});
在这里,我正在使用bindings模块来要求一个.node文件,该文件将字符串传递给我的应用程序。这似乎是导致错误的模块。
我已经尝试解决几个小时了,但是我在网上找不到任何东西。我也找不到任何人遇到与我相同的错误。有关如何解决此问题的任何建议,将不胜感激。
问候
Matt.S
编辑:
我可能刚发现主要问题。绑定模块包含一个寻找模块根目录的函数。此路径显示在错误的第一行。但是,由于该应用程序已经构建完毕,因此所有源代码都在app.asar文件中。绑定似乎无法区分.asar文件和普通文件夹。因此,即使路径正确,它也不起作用。它之所以能在原始的Win-Unpacked中工作,是因为绑定(如果找不到模块根)会向上移动目录直到找到根。而且由于原始的win-unpacked文件夹位于我的项目目录中,因此绑定使用未构建的模块根目录。
答案 0 :(得分:1)
我能够使用绑定模块重现此错误。
电子骨架似乎存在很多问题,可能会导致这种行为。
您通过对原始问题的修改自己回答了这个问题,但是为了提供完整的答案,我也将其包括在内
我只是在win-packed文件夹中启动setup.exe,一切顺利进行。现在,当我将win-unpacked文件夹移到另一个目录时,我的应用程序可以正常运行,但是在启动解压缩过程时会引发错误。
这有一个有趣的原因。由于您的 dist 目录(项目的构建目标)位于您的工作项目中,因此绑定模块假定您的工作目录是根目录您的内置应用。因此,它能够解析模块的路径,并且一切正常。一旦将您构建的应用程序放置在其他位置,绑定模块将无法找到应用程序的根目录,并引发您链接的错误。
绑定模块的另一个问题是使用“文件”协议处理路径。
有人已经解决了这个问题,created an issue(+请求请求),因此即使我不鼓励采取这种措施,您也可以可以修改此模块的本地安装。
绑定模块的当前状态使其与Electron框架一起使用时没有吸引力。我听说它甚至在正确处理变音符号方面都存在问题,因此在特定情况下最好的选择就是摆脱它。您可以制作一个小的本地模块,该模块包装您的.node二进制文件,并使其与其他所有节点模块一样容易。