Как мне вернуть мои данные из моего IpcMain - PullRequest
0 голосов
/ 05 мая 2020

Я создаю перетаскивание в реакции и использую электрон для отправки и получения данных моего файла. Я получаю senderId и отправителя в console.log. Как я могу получить данные? Что мне не хватает?

Dropzone. js файл

const [fileNames, setFileNames] = useState([]);

const handleDrop = useCallback(acceptedFiles => {
  setFileNames(_.map(acceptedFiles, ({ name, type, path, size, lastModified, 
   lastModifiedDate }) => {
    return { name, type, path, size, lastModified, lastModifiedDate };
  }))
  let formData = new FormData();
  formData.append('uploadedFiles', fileNames);
}, [fileNames]);


useEffect(() => {
  ipcRenderer.send(FETCH_AUDIO_FILES, fileNames);
}, [fileNames]); 

useEffect(() => {
  const handler = (filesWithData) => {
  _.map(filesWithData, (event, data) => {
    console.log(data);
  })
};
ipcRenderer.on(METADATA_COMPLETED, handler);
  return () => ipcRenderer.removeListener(METADATA_COMPLETED, handler);
});

индекс. js файл

 ipcMain.on(FETCH_AUDIO_FILES, (event, files) => {
    const promises = _.map(files, (file) => {
    return new Promise((resolve, reject) => {
    NodeID3.read(file.path, (err, tags) => {
       resolve({
         ...files,
         ...tags
      })
    })
  })
});

Promise.all(promises).then(results => { 
  event.sender.send(METADATA_COMPLETED, results);
 [![enter image description here][1]][1]});
});

1 Ответ

1 голос
/ 05 мая 2020

Вы не можете отправлять специальные объекты, такие как файлы, по IP-каналу. C канал:

Аргументы будут сериализованы с помощью алгоритма структурированного клонирования, как и postMessage, поэтому цепочки прототипов не будут включены. Отправка функций, обещаний, символов, WeakMaps или WeakSets вызовет исключение.
ПРИМЕЧАНИЕ: Отправка нестандартных типов JavaScript, таких как объекты DOM или специальные объекты Electron, устарела и начнет генерировать исключение, начиная с Electron 9.

- https://www.electronjs.org/docs/api/web-contents#contentssendchannel -args

Вы можете прочитать свой файл как строку Base64, буфер или что-то еще в процесс рендеринга, затем отправьте его в основной процесс, или, если вы хотите выбрать файлы, возможно, сделайте все это в основном процессе, например, https://www.electronjs.org/docs/api/dialog#dialogshowopendialogbrowserwindow -options ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...