Привет, ребята,
Недавно я столкнулся с неразрешимой ошибкой, о которой хочу рассказать. Итак, что я в основном сделал, так это реализовал перетаскивание в своем приложении electronic/angularjs. Приложение представляет собой простой клиент WebDav, который берет файлы из проводника и загружает их на сервер WebDav. Ничего особенного.
Для этого я применил базовый механизм перетаскивания html5 к моему основному файлу index.html:
<body ng-controller=”IndexController as index” layout=”column” ng-cloak ondrop=”drop(event)” ondragover=”allowDrop(event)”>
где drop(event) — это метод, определенный в моем контроллере angularjs IndexController:
drop = (ev) => { ev.preventDefault(); droppedFiles = ev.target.files || ev.dataTransfer.files; //assign files to fileservice fileService.files = droppedFiles; //open wizard popup showWizzard(); }
Это работает нормально, и все перетаскиваемые файлы попадут в мою файловую службу, содержащую массив файлов. По крайней мере, я думал, что это…
Но время от времени случалось, что мое приложение просто переставало работать. Всякий раз, когда это случалось, это происходило сразу после перетаскивания файлов в мое приложение, но никаких исключений не было. Совсем ничего. Поэтому я решил перехватывать все неперехваченные исключения прямо в файле main.js. Что в основном является корнем всего проекта:
//Incaught Exception Listener process.on(‘uncaughtException’, function (error) { console.log(error); })
После удаления некоторых файлов у меня все еще была та же проблема. Но до сих пор нет сообщения об ошибке. И да, я смотрел на свою консоль node.js вместо консоли отладки браузера, но она была пуста. Нет ошибки вообще. Копнув немного глубже, я понял, что нарушение было вызвано добавлением файлов размером более ~ 200 МБ…
Итак, я отладил приложение и обнаружил момент, когда приложение просто перестало работать, не выдавая ошибки. Самое интересное было положение всего происходящего само по себе, потому что именно в этот момент происходит межпроцессное общение. Кажется, что основной процесс электрона (который отвечает за окно и, следовательно, за функциональность перетаскивания) отправляет файл другому подпроцессу, который заботится о моей реализации angularjs. К сожалению, если файл больше ~ 200 МБ, процесс перестает работать. Я до сих пор не знаю, почему, может быть, из-за тайм-аута.
Узнав, что я переместил логику загрузки в основной процесс:
for (var index = 0; index < length; index++) { console.log(fileService.files[index]);var name = fileService.files[index].name; var promise = electronApp.uploadFile(fileService.files[0].path, currentPath, name, policyAsString) .catch((error) => { console.log(error); }); promises.push(promise); }
вместо реализации функции uploadFile() внутри моего app.js, который содержит мою логику angularjs, я реализовал функцию в своем электронном приложении:
app.uploadFile = function (localFile, webdavFolder, filename, policy) { var promise = new Promise((resolve, reject) => { fs.readFile(localFile, (err, data) => { … }); }); });
Это решило проблему, потому что больше нет необходимости отправлять файл через электронные процессы.
Я надеюсь, что смогу помочь кому-то с той же проблемой, если у вас есть вопросы, не стесняйтесь обращаться ко мне.
Ваше здоровье
ОБНОВИТЬ:
То же самое произошло при чтении файлов с помощью fs. В основном всякий раз, когда основной процесс отправляет данные процессу рендеринга. Я открыл вопрос на git-сайте электрона: https://github.com/electron/electron/issues/8523.