Как исправить ошибку - конец подписи записи центрального каталога не найден? - PullRequest
0 голосов
/ 27 мая 2019

Сначала я делю видео на кадры с помощью ffmpeg (на сервере Converter, Windows), после чего я создаю архив, который мне нужно перенести на другой сервер (сервер-генератор, Linux), где находится архив с видео и /или image, frames и файл data.json должны быть разархивированы, а содержимое архива должно использоваться в дальнейшем.

Для разархивирования я взял библиотеку extract-zip (основанную на yauzl) и использовал promisifyиз утилитного модуля.

Проблема в том, что когда я отправляю изображение в Конвертер для обработки, все работает как надо;однако, когда я отправляю видео, я получаю эту ошибку - «конец подписи записи центрального каталога не найден».

Мне кажется, что проблема связана с асинхронностью или циклом обработки событий.

  • Я пытался не использовать promisify, но у меня возникла следующая проблема - в тот момент, когда мне нужно использовать данные из архива, этот архив еще не существует («папка не существует»);
  • Попробовал еще несколько библиотек для разархивирования adamzip, unzip, deppress, node-zip;
  • Я пытался создать цепочку обещаний;
...
const fs = require('fs-extra')
const path = require('path')
cosnt util = require('util')
const extractZip = util.promisify(require('extract-zip'))
...

...
/**
* Factory that creates a project based on the archive.
* @param {string} archive Path to the source archive
* @returns {Promise.<Project>}
*/
static async create (archive) {
  const dir = fs.mkdtempSync(path.join(this.baseDir, '/'))
  await extractZip(archive, { dir })
  const data = await fs.readJson(path.join(dir, 'data.json'))
  return new this(data, dir)
}
...

/* Tried to do this w/ chaining promises:

static async create (archive) {
  const dir = fs.mkdtempSync(path.join(this.baseDir, '/'))
  await extractZip(archive, { dir })
   .then( async () => {
    const data = await fs.readJson(path.join(dir, 'data.json'))
    return data
   })
   .then( async (data) => {
    return new this(data, dir)
   })
}

*/


1 Ответ

0 голосов
/ 29 мая 2019

Я решил проблему. Оказалось, что я асинхронно скачивал большой архив с сервера, поэтому, исправляя этот момент, все работало как надо.

Wrong:
fs.writeFile(...)
Correct:
fs.writeFileSync(...)

Вывод: столкнулся с аналогичной проблемой - вам нужно пройти через всю цепочку передачи данных и стека функций / вызовов, которые в ней участвуют.

...