2016-08-02 59 views
1

我試圖製作一個可以發送貓圖片的Facebook聊天機器人。我使用RESTful API來獲取貓的照片。他們返回原始png。下一步也是最後一步是將該圖像轉換爲可讀流,以便Facebook Chat API可以作爲附件發送。將PNG從GET請求轉換爲Node.js中的可讀流

我用request.js來抓圖像。請求的文檔只提到將圖像保存爲文件並將文件讀入stream.Readable。我想知道是否有辦法繞過臨時文件,並將圖像直接傳輸到Facebook Chat API中。

這裏是我到目前爲止的代碼:

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. 這是主要的問題,這是你需要在新的Readable流實例上實現._read()。即將到來的節點版本將具有更好的錯誤消息。因此,現在,您可以在創建picStream後添加picStream._read = function(n){};
  2. 圖像被不必要地轉換爲base64並再次返回。您可以在options對象中設置encoding: nullbody將在您的回調中設置爲Buffer實例。那麼你可以做picStream.push(body);
  3. 流未結束。添加picStream.push(null);你做picStream.push(body);

最後後,這有點offtopic,但它是一種愚蠢的模塊力流使用時request使用了底層form-data模塊支持多種不同類型的值(包括用作文件內容的實例Buffer實例)。

+0

感謝澄清事情!我已經實施了所有這三個建議。我再也沒有得到這種表單數據錯誤,但是出現了一個新的錯誤:TypeError:無法將undefined或null轉換爲object。它位於[sendMessage.js的第205行](https://github.com/Schmavery/facebook-chat-api/blob/master/src/sendMessage.js#L205)。我認爲'文件'是空或什麼的。作爲參考,我打印出請求'body','request'確實正確讀取緩衝區,所以在那裏不應該有問題。 – renxinhe

+0

Update 8/2 5:30 pm:我剛剛在'sendMessage.js'的第205行記錄了'file'。它顯示'file'是'undefined'。我還遇到'uploadAttachment錯誤:錯誤:讀ECONNRESET'一次。我重試了腳本,舊的TypeError又回來了。 – renxinhe

相關問題