2016-10-29 3 views
0

イメージをblobとして受け入れるノードサーバー(Expressを使用)があります。私は確かにこれを外部リクエストに直接パイプします。すなわち、リクエストデータをファイルに保存して、同時に外部リクエストにパイプすることはできません

app.post('/process', function(req, res) { 
    req.pipe({url: '<url-to-external-server>',...}, 
     function(err,response,body) { 
      //process external response. 
     } 
    );  
} 

これはすべて正常に機能します。今、私も同様に、データをディスクに保存したいと思いますので、私はその機能を追加し、そのコードは今のようになります。何が起こることは、ファイルが正しく保存されていないことである

app.post('/process', function(req, res) { 
    var filename = generateUniqueFileName(); 
    var writeStream = fs.createWriteStream(filename); 
    req.pipe(writeStream); 

    req.pipe({url: '<url-to-external-server>',...}, 
     function(err,response,body) { 
      //process external response. 
      var respData = processBody(
      if (!error && response.statusCode == 200) { 
      res.send(respData); 
      } else { 
      // send error. 
      res.send(...); 
      } 
     } 
    );  
} 

。私はここで間違って何をしていますか?

+0

あなた自身ではなく、ライブラリにその部分を残す必要があります。 [multer](https://github.com/expressjs/multer)はそのための良いライブラリです。 –

+0

ルートの動作方法を変更することを提案していますが、ファイルを使用してフォームデータを取得し、ファイルを読み込んで外部リクエストにストリームしますか? – allisonh

答えて

2

1つのソースストリームを2つの宛先ストリームにパイプすることはできません。 2つの異なる宛先にパイプするために、ストリームを作成する必要があります(スプリットソースストリーム)。ノードのストリームモジュールにはパススルーがあります。

app.post('/process', function(req, res) { 
    // create a pass through stream 
    var PassThrough = require('stream').PassThrough; 
    var passThroughStream = new PassThrough(); 

    var filename = generateUniqueFileName(); 
    var writeStream = fs.createWriteStream(filename); 

    req.pipe(passThroughStream); // split it to this new stream 
    passThroughStream.pipe(writeStream); // pipe this to 1st destination 

    // now pipe it to 2nd destination 
    req.pipe({url: '<url-to-external-server>',...}, 
     function(err,response,body) { 
     //process external response. 
     var respData = processBody(
     if (!error && response.statusCode == 200) { 
      res.send(respData); 
     } else { 
      // send error. 
      res.send(...); 
     } 
     } 
    ); 
} 
+0

ありがとうございました!昨日、私はパススルーを使用していましたが、パススルーへのパイプの前に外部URLへのパイプがあり、エラーが発生しました。 – allisonh

関連する問題