Ошибка создания Jimp.read - привязка zlib закрыта - PullRequest
0 голосов
/ 08 сентября 2018

Я работаю с использованием Node и Discord.js, внося изменения в исходный код бота Discord для клиента. Поэтому я не смогу предоставить полные исходные файлы, поскольку подавляющее большинство кода не принадлежит мне, и я бы предпочел не выпускать код клиента на всякий случай - но я буду публиковать фрагменты, написанные мной. которые имеют отношение к вопросу.

Задача состоит в том, чтобы заставить бота сгенерировать изображение, выделяющее «ежедневные» предметы в игровом магазине Fortnite. По сути, это фоновое / шаблонное изображение, в котором изображения различных предметов магазина будут наложены на поля в шаблонном изображении. Чтобы добиться этого, я пытался использовать Jimp для манипуляции / генерации изображений. Однако я столкнулся со странной проблемой, которая, кажется, возникает только тогда, когда изображения получены из API, предоставляющего pngs элемента Fortnite.

Этот API-интерфейс возвращает (помимо прочего) URL-адрес изображения, который я изначально пытался использовать для чтения с Jimp. (Обратите внимание, что на самом деле я не могу предоставить какие-либо ссылки на документы API, поскольку он находится в закрытой бета-версии; у меня есть доступ к нему только потому, что клиент дал мне свой токен, чтобы я мог над ним поработать.) Jimp.read предназначено для URL-адрес img, который он обрабатывает в образе Jimp - и это нормально работает, когда я использую URL-адрес изображения из любого другого источника . Тем не менее, при передаче ему URL из этого API, это вызывает исключение, которое console.log s как:

AssertionError [ERR_ASSERTION]: zlib binding closed

(за ним следует оставшаяся часть трассировки стека, которую я опубликую в полном объеме ниже).

Я уже несколько часов бью головой об стену, пытаясь прорваться через это, Гугл, пытаясь найти обходные пути, пробовать альтернативные библиотеки, но до сих пор не смог никуда добраться. Я попытался загрузить изображение в буфер и подать , что в Jimp.read, но получаю точно такую ​​же ошибку, слово в слово. Попытался использовать конструктор new Jimp( ... ), но все равно не работал.

Я также пытался найти ответ в Google, но ошибка zlib binding closed кажется крайне необычной, и было очень мало упоминаний об этом в любом контексте, и никаких упоминаний об этом относительно Jimp, которые я смог найти. Погуглив "zlib binding closed" в кавычках, я получил только 19 результатов. Если больше ничего, если кто-нибудь знает, что означает эта ошибка , это помогло бы мне лучше понять, где ее можно исправить.

Я пытался найти альтернативы библиотеке Jimp, но что касается библиотек, управляющих изображениями JavaScript, Canvas API требует объект DOM и Caman, который я просто не смог установить.

Обычно я не спрашиваю о StackOverflow, но нигде не могу найти экземпляров этой проблемы. Возможные решения или даже просто объяснения того, что может означать ошибка, были бы чрезвычайно полезны, даже если у кого-то есть предложения относительно хорошей альтернативы Jimp в случае, если я не могу это исправить.

(Ниже приведены фрагменты кода / трассировки стека, я, вероятно, пропустил некоторые важные вещи, так как устал от работы над этим, и мне совершенно не по себе, поэтому дайте мне знать, если вам что-то еще понадобится от меня)

Попытка URL:

Jimp.read("https://image.fnbr.co/outfit/5b90ec38262b40c2dcc98379/icon.png")
    .then(image => {
        message.channel.send("jimp", {
            file: image
        });
    })
    .catch(err => {
        console.log(err);
    });") // Should just return a URL string
    .then(image => {
        message.channel.send("jimp", {
            file: image
        });
    })
    .catch(err => {
        console.log(err);
    });

Попытка буфера:

request.get("https://image.fnbr.co/outfit/5b90ec38262b40c2dcc98379/icon.png", function(error, response, body) {
    if (!error && response.statusCode == 200) {
        var buffer = new Buffer(body);
        Jimp.read(buffer)
            .then(image => {
                message.channel.send("jimp", {
                    file: image
                });
            })
            .catch(err => {
                console.log(err);
            });
    } else {
        console.log("8(");
    }
});

^ В конечном итоге вышеизложенное будет получать URL-адреса изображений на основе «ежедневных» результатов из магазина, но сейчас я просто пытаюсь заставить их работать с жестко закодированным URL-адресом. Все URL этого API имеют тот же формат, что и используемый здесь.

Полный console.log(err) Выход на консоль:

{ AssertionError [ERR_ASSERTION]: zlib binding closed
    at Inflate._processChunk (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\sync-inflate.js:108:3)
    at zlibBufferSync (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\sync-inflate.js:151:17)
    at inflateSync (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\sync-inflate.js:155:10)
    at module.exports (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\parser-sync.js:79:20)
    at Object.exports.read [as image/png] (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\png-sync.js:10:10)
    at Jimp.parseBitmap (C:\Users\(user)\Documents\dev\(project)\node_modules\@jimp\core\dist\utils\image-bitmap.js:117:53)
    at new Jimp (C:\Users\(user)\Documents\dev\(project)\node_modules\@jimp\core\dist\index.js:425:32)
    at _construct (C:\Users\(user)\Documents\dev\(project)\node_modules\@jimp\core\dist\index.js:100:393)
    at C:\Users\(user)\Documents\dev\(project)\node_modules\@jimp\core\dist\index.js:885:5
    at Promise (<anonymous>)
  generatedMessage: false,
  name: 'AssertionError [ERR_ASSERTION]',
  code: 'ERR_ASSERTION',
  actual: undefined,
  expected: true,
  operator: '==',
  methodName: 'constructor' }

Управление пакетами с помощью npm, запущенных с компьютера Windows.

...