Node.js — загрузка и обработка изображения с помощью «запроса» и «узла-холста»

Я использую request и node-canvas для загрузки и обработки изображения:

var request = require('request');
var Image = require('canvas').Image;

var url = 'http://farm8.staticflickr.com/7333/11286633486_070f0d33bc_n.jpg';

request.get({ url: url, encoding: null }, function(err, res, body) {
    if (err) throw err;

    var image = new Image();

    image.onerror = function() {
        console.error(arguments);
    };

    image.onload = function() {
        console.log('loaded image');
    };

    image.src = new Buffer(body, 'binary');
});

Я получаю сообщение об ошибке "Error: error while reading from input stream" (запускается событие onerror). Но когда я нажимаю указанный выше URL-адрес изображения в браузере, он отображает изображение, как и ожидалось.

Что я делаю не так?


person Sunday Ironfoot    schedule 30.01.2014    source источник
comment
Он работает, как и ожидалось, запуская событие onload. Какую версию узла, запроса и холста вы используете?   -  person mutil    schedule 30.01.2014
comment
Я использую Node v0.10.21. Я установил request и canvas через npm, поэтому я предполагаю, что это последняя версия. Я использую OSX 10.9 (Mavericks), следуя инструкциям по установке Pixman и Cairo.   -  person Sunday Ironfoot    schedule 30.01.2014
comment
холст версии 1.1.3. запрос 2.33.0   -  person Sunday Ironfoot    schedule 30.01.2014
comment
Можете ли вы подтвердить, что тело действительно является буфером? Я вижу, что только если я удаляю encoding: null, я получаю сообщение об ошибке. Кроме этого, я не могу думать ни о чем другом. Я просто скопировал ваш код, установил последний холст и запрос на Linux-машину с узлом v0.10.15, и это сработало.   -  person mutil    schedule 30.01.2014
comment
Да, это определенно буфер. Если я запускаю console.log(body), терминал выводит Buffer [ O1 12 B2 G4 и т. д. и т. д. … Я могу использовать body для записи образа на жесткий диск, и я получаю действительный файл изображения, который я могу открыть и т. д.   -  person Sunday Ironfoot    schedule 30.01.2014


Ответы (1)


Починил это!

Кажется, у меня была поврежденная установка pixman и/или cairo на OSX (зависимости от node-canvas), вероятно, потому, что я пытался установить их через homebrew.

Решение состояло в том, чтобы избавиться от них от доморощенного, используя:

brew uninstall cairo
brew uninstall pixman

... затем запустите:

brew doctor

.. проверить наличие неработающих символических ссылок и т. д., связанных с cairo и pixman. Затем вам нужно вручную удалить все cairo & pixman bins/libs/symlinks и т. д. с помощью Finder.

Затем следуйте инструкциям по установке для node-canvas, чтобы переустановить cairo. и пиксман на OSX.

Наконец, вам, вероятно, потребуется переустановить node-canvas через npm, поэтому перейдите в папку «node_modules» и удалите каталог «canvas». Затем запустите:

npm install canvas
person Sunday Ironfoot    schedule 30.01.2014