Сначала я делю видео на кадры с помощью 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)
})
}
*/