在Node.js中将PNG从GET请求转换为可读stream

我正在尝试制作一个可以发送猫照片的Facebook聊天机器人。 我使用RESTful API来获取猫图片。 他们是原始PNG返回。 接下来最后一步是将该图像转换为可读stream,以便Facebook Chat API可以将其作为附件发送。

我使用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 } 

这里有几个问题:

  1. 这是您需要在新的Readablestream实例上实现._read()的主要问题。 即将到来的节点版本将具有更好的错误消息。 所以现在,你可以添加picStream._read = function(n){}; 你创buildpicStream
  2. 图像被不必要地转换为base64,然后再返回。 你可以在你的options对象中设置encoding: nullbody将在你的callback中成为一个Buffer实例。 然后你可以做picStream.push(body);
  3. stream没有被结束。 添加picStream.push(null); 之后你做picStream.push(body);

最后,这有些偏离主题,但是当request使用的底层form-data模块支持许多不同types的值(包括一个原始的Buffer实例作为文件)。