pipe道可读stream使用superagent
我正在尝试创build一个multer中间件,通过superagent将stream媒体文件从客户端传送到第三方。
const superagent = require('superagent'); const multer = require('multer'); // my middleware function streamstorage(){ function StreamStorage(){} StreamStorage.prototype._handleFile = function(req, file, cb){ console.log(file.stream) // <-- is readable stream const post = superagent.post('www.some-other-host.com'); file.stream.pipe(file.stream); // need to call cb(null, {some: data}); but how // do i get/handle the response from this post request? } return new StreamStorage() } const streamMiddleware = { storage: streamstorage() } app.post('/someupload', streamMiddleware.single('rawimage'), function(req, res){ res.send('some token based on the superagent response') });
我认为这似乎工作,但我不知道如何处理来自superagent POST
请求的响应,因为我需要返回从superagent请求收到的令牌。
我试过post.end(fn...)
但显然end
和pipe
不能同时使用 。 我觉得我误解了pipe道的工作原理,或者我想要做的是实际的。
Superagent的.pipe()
方法用于下载(从远程主机到本地应用程序的pipe道数据)。
看起来你需要在另一个方向上pipe道:从应用程序上传到远程服务器。 在superagent(自v2.1)没有办法,它需要一个不同的方法。
你有两个select:
最简单,效率较低的是:
告诉multer缓冲/保存文件,然后使用.attach()
上传整个文件。
更难的是“手动”pipe道“文件”:
- 使用要上传的URL,方法和HTTP标头创build一个超级实例,
- 在传入的文件stream上监听
data
事件,并对每个数据块调用superagent的.write()
方法。 - 在传入的文件stream上聆听
end
事件,并调用superagent的.end()
方法读取服务器的响应。