2016-05-22 8 views
0

私はnode.jsにTwitterボットゲームを構築しています。私は、同期関数(getImage)を持つasync.waterfallを持っているTwitterのストリームを開くstreamOnのスクリプトを持っています。 getImageは、スクリプトがトリガーされたときに301の応答を返すことがあります。 streamOnは引き続き開いたままですが、プレーヤーはエラーについて知らないので、返される画像はありません。エラーが発生した場合、async.waterfallを再起動するにはどうすればよいですか?

async.waterfallは、プレーヤーがまだ画像を取得するためにエラーが発生した場合、ステップの最初から「再試行」するにはどうすればよいですか?ここで

async.waterfall次のとおりです。これは私がそれは次のようになり想像ものです

function getImage() { 

    var http=require('http'), imageBuffer; 

    http.get(
     'http://www.kame.net/img/kame-anime-small.gif', 
     function(res) { 
     var body=new Buffer(0); 

     if (res.statusCode!==200) { 
      return console.error('HTTP '+res.statusCode); 
     } 

     res.on('data', function(chunk) { 
      body=Buffer.concat([body, chunk]); 
     }); 

     res.on('end', function() { 
      imageBuffer=body; 
     }); 

     res.on('error', function(err) { 
      console.error(err); 
     }); 
     } 
    ); 
} 
+0

厳密に言えば、301はエラーではありません。あなたのURLを更新する必要があると伝えています。なぜあなたはリダイレクト応答を得ているのか調べましたか? – mdickin

+0

@mdickinはい、ありがとうございます。画像ソースはAPIを使用してBingの検索結果から来ているので、動作していない時間よりもずっと時間がかかっていますが、たびに301レスポンスが返されます。私は正直なところ、スクリプトが301を返す前にスクリプトを実行する必要があります。 – filmplane

+0

レスポンスの 'Location'ヘッダ値に対してGETリクエストを再実行することを検討しましたか?画像がどこに移動したのかが分かるはずです。 – mdickin

答えて

0

streamOn(function(tweet) { 
    async.waterfall([ 
    getName, 
    searchImage, 
    getImage, 
    postTweet.bind(null, tweet) 
    ], 
    function(error, result) { 
    if (error) { 
     console.error(error); 
     return; 
    } 
    console.log(result); 

    }); 
} 

、ここではgetImage機能の簡易版です。コールバックにコールを追加しました。非同期ではそれを続行する必要があるためです。

リダイレクトループが発生する可能性があります。.headersが応答の正しいプロパティであるかどうかわかりません。

function getImage(url, callback) { 

    var http=require('http'), imageBuffer; 

    http.get(
     url, 
     function(res) { 
     var body=new Buffer(0); 

     if (res.statusCode!==200) { 
      if (res.statusCode === 301) { 
       getImage(res.headers["Location"], callback) //I'm not sure if .headers is correct 
       return; 
      } 
      console.error('HTTP '+res.statusCode); 
      callback(new Error('HTTP '+res.statusCode)) //Might want a better error 
     } 

     res.on('data', function(chunk) { 
      body=Buffer.concat([body, chunk]); 
     }); 

     res.on('end', function() { 
      imageBuffer=body; 
      callback(null, imageBuffer) 
     }); 

     res.on('error', function(err) { 
      console.error(err); 
      callback(err); 
     }); 
     } 
    ); 
} 
+0

私は 'async.waterfall'の' postTweet'部分と 'getImage'が成功した時間の大半を使わずにスクリプトを実行していました。しかし、301レスポンスに加えて、403レスポンスと400レスポンスもあります。このスクリプトは、設定された間隔の関数で実行されます: 'のsetInterval(関数(){ 試し{ ラン();} キャッチ(電子){ はconsole.log(E);} }、20000);'と200の応答がない場合、別のGET要求を実行します。私は、異なる回答を説明しようとするのではなく、このロジックを実装する必要があるのだろうか? – filmplane

+1

4xxエラーが発生した場合は、エラーを記録して失敗することが適切な応答であると言えます。コールバックをエラーで呼び出すと、滝が止まるでしょう。これはtweetingから停止します。その後、setIntervalは後で再び実行されます。 – mdickin

+0

私はこれを非同期ドキュメントで発見しました:https://github.com/caolan/async#retry – filmplane

関連する問題