在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 }
这里有几个问题:
- 这是您需要在新的
Readable
stream实例上实现._read()
的主要问题。 即将到来的节点版本将具有更好的错误消息。 所以现在,你可以添加picStream._read = function(n){};
你创buildpicStream
。 - 图像被不必要地转换为base64,然后再返回。 你可以在你的
options
对象中设置encoding: null
,body
将在你的callback中成为一个Buffer
实例。 然后你可以做picStream.push(body);
。 - stream没有被结束。 添加
picStream.push(null);
之后你做picStream.push(body);
最后,这有些偏离主题,但是当request
使用的底层form-data
模块支持许多不同types的值(包括一个原始的Buffer
实例作为文件)。