2016-08-02 3 views
1

Я пытаюсь сделать бот-чат Facebook, который может отправлять фотографии кота. Я использую RESTful API, чтобы получить фотографии кота. Они возвращаются как необработанные png. Следующий и последний шаг - преобразовать это изображение в Readable Stream, так что Facebook Chat API может отправить его в виде вложения.Преобразование PNG из запроса GET в Readable Stream в Node.js

Я использую request.js, чтобы получить изображение. В документации заявки упоминается сохранение изображений в виде файла и чтение файлов в stream.Readable. Интересно, есть ли способ обойти этот временный файл и передать изображение прямо в API Facebook Chat.

Вот мой код до сих пор:

var request = require("request"); 
var stream = require("stream"); 

module.exports = function getCatPicture(api, threadID, body) { 
    var options = { 
     url: 'http://thecatapi.com/api/images/get?type=png', 
     encoding: 'base64' 
    } 
    var picStream = new stream.Readable; 
    request.get(options, function (error, response, body) { 
     picStream.push(body, 'base64'); 
     var catPic = { 
      attachment: picStream 
     }; 
     api.sendMessage(catPic, threadID); 
     return; 
    }); 
} 

Я получаю сообщение об ошибке:

Error in uploadAttachment Error: form-data: not implemented 
Error in uploadAttachment  at Readable._read (_stream_readable.js:457:22) 
Error in uploadAttachment  at Readable.read (_stream_readable.js:336:10) 
Error in uploadAttachment  at flow (_stream_readable.js:751:26) 
Error in uploadAttachment  at resume_ (_stream_readable.js:731:3) 
Error in uploadAttachment  at nextTickCallbackWith2Args (node.js:442:9) 
Error in uploadAttachment  at process._tickCallback (node.js:356:17) 
Error in uploadAttachment { [Error: form-data: not implemented] 
Error in uploadAttachment cause: [Error: form-data: not implemented], 
Error in uploadAttachment isOperational: true } 
+0

см. Https://github.com/maxogden/mississippi#from и https://github.com/yoshuawuyts/from2-string –

+0

Вы нажимаете на читаемый поток только после того, как запрос возвращает все pody, потому что вы работая с обратным вызовом, вам нужно передать ... например 'request ('http://google.com/doodle.png') .pipe (fs.createWriteStream ('doodle.png'))' – yeya

ответ

1

Есть несколько вопросов здесь:

  1. Это главная проблема, которая заключается в том, что вам нужно реализовать ._read() в вашем новом экземпляре потока Readable. Предстоящая версия узла будет иметь лучшее сообщение об ошибке. Так что пока вы можете добавить picStream._read = function(n){}; после создания picStream.
  2. Изображение излишне преобразуется в base64 и обратно. Вы можете просто установить encoding: null в свой options объект, а body будет экземпляром Buffer внутри вашего обратного вызова. Тогда вы можете просто сделать picStream.push(body);.
  3. Поток не заканчивается. Добавить picStream.push(null); после выполнения picStream.push(body);

Наконец, это немного оффтоп, но это глупо, что модуль силы потоков, которые будут использоваться, когда основной form-data модуль, который использует request поддерживает множество различных типов значений (в том числе raw Buffer экземпляр для использования в качестве содержимого файла).

+0

Спасибо, что разъясняет все ! Я выполнил все три этих предложения. Я больше не получаю эту ошибку данных формы, но появился новый: 'TypeError: Невозможно преобразовать undefined или null в object'. Он находится по адресу [line 205 of sendMessage.js] (https://github.com/Schmavery/facebook-chat-api/blob/master/src/sendMessage.js#L205). Я думаю, что 'файл' является нулевым или чем-то. Для справки я распечатал запрос 'body', а' request' действительно правильно читает буфер, поэтому там не должно быть проблем. – renxinhe

+0

Обновление 8/2 5:30 вечера: Я только что зарегистрировал 'файл' в строке 205' sendMessage.js'. Он показывает, что 'файл'' undefined'. Я также столкнулся с ошибкой ErrorAttachment Error: прочитайте ECONNRESET один раз. Я повторил сценарий, и старый «TypeError» вернулся. – renxinhe

Смежные вопросы