2016-08-08 13 views
1

superagentを介してクライアントからのストリームファイルをサードパーティにパイプするためのmulterミドルウェアを作成しようとしています。スーパーエージェントを使用した読み込み可能なストリームのパイプ

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要求から受信したトークンを返す必要があるため、たSuperAgent POST要求からの応答を処理するかどうかはわかりません。

私はpost.end(fn...)を試しましたが、明らかにendpipecan't both be used togetherです。私はパイピングの仕組みを誤解しているような気がしています。

答えて

3

Superagentの.pipe()メソッドはダウンロード用です(リモートホストからローカルアプリケーションにデータをパイプする)。

他の方向にパイピングする必要があるようです。アプリケーションからリモートサーバーにアップロードします。スーパーエージェント(v2.1時点)にはそのための方法はなく、別のアプローチが必要です。 /バッファファイルを保存し、.attach()を使用してファイル全体をアップロードする

テルのmulter:

最も簡単な、効率の低い1は、次のとおりです。

は、2つのオプションがあります。

難しい1は「パイプ」にファイル「手動」である:あなたがアップロードする必要URL、メソッドおよびHTTPヘッダでたSuperAgentインスタンスを作成し、

  • が入ってくるのdataイベントを聴く

    1. ファイルストリームを作成し、各スーパーデータのメソッドを.write()メソッドで呼び出すことができます。
    2. 受信ファイルストリームのendイベントをリッスンし、サーバの応答を読み取るために、スーパーエージェントの.end()メソッドを呼び出します。
  • +0

    これは意味があります。私は現在最初の提案をしているので、私は2番目の解決策を試してみましょう。 –

    関連する問題