Передача читаемого потока с использованием суперагента
Я пытаюсь создать многоуровневое промежуточное программное обеспечение для передачи потокового файла от клиента к сторонней организации через суперагент.
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')
});
Я думаю, что это похоже на работу, но я не уверен, как справиться с ответом от суперагента POST
запрос, так как мне нужно вернуть токен, полученный из запроса superagent.
я пробовал post.end(fn...)
но видимо end
а также pipe
оба не могут быть использованы вместе. Мне кажется, что я неправильно понимаю, как работает трубопровод, или если то, что я пытаюсь сделать, является практичным.
1 ответ
Суперагент -х .pipe()
Метод для загрузки (передача данных с удаленного хоста в локальное приложение).
Похоже, вам нужно в другом направлении: выгрузить из приложения на удаленный сервер. В суперагенте (начиная с v2.1) для этого нет метода, и он требует другого подхода.
У вас есть два варианта:
Самый простой, менее эффективный:
Скажите multer, что нужно буферизовать / сохранить файл, а затем загрузить весь файл, используя .attach()
,
Сложнее всего "вручную" "передать" файл:
- Создайте дополнительный экземпляр с URL, методом и заголовками HTTP, которые вы хотите загрузить,
- Слушать
data
события во входящем потоке файлов и вызов суперагента.write()
метод с каждой порцией данных. - Слушать
end
событие в потоке входящего файла и вызов суперагента.end()
способ прочитать ответ сервера.