Привет, ребята,

Недавно я столкнулся с неразрешимой ошибкой, о которой хочу рассказать. Итак, что я в основном сделал, так это реализовал перетаскивание в своем приложении 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.