2016-05-22 66 views
0

我在node.js中构建了一个Twitter机器人游戏。我有一个具有同步功能的脚本(打开Twitter流的streamOn),然后是具有HTTP GET请求功能的async.waterfallgetImage)。当脚本被触发时,getImage有时会返回301响应。 streamOn继续保持打开,但玩家不知道错误,只是没有图像返回。如果抛出错误,我该如何重新启动async.waterfall?

如何让async.waterfall从其开始的步骤“重试”,如果它抛出一个错误,所以玩家仍然得到一个图像?

这里是async.waterfall

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功能的简化版本:

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不是错误。它告诉你你的网址需要更新。你有没有研究过你为什么得到重定向响应? – mdickin

+0

@mdickin是的,谢谢澄清。图片来源来自Bing搜索结果,使用API​​的次数超过了它的效果,但是每隔一段时间它就会返回一个301响应。我真的需要运行脚本一段时间,然后它返回一个301 ... – filmplane

+0

你有没有考虑重新运行GET请求对响应中的“位置”标头值?这应该告诉你图像已经移动的位置。 – mdickin

回答

0

这就是我想象它会是什么样子。我添加了对回调的调用,因为异步需要继续。

请注意,您可能会进入重定向循环,并且我不确定.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(函数(){ 尝试{ 的run();} 赶上 (E){ 的console.log(E);} } ,20000); 1',它只是执行另一个GET请求,如果没有200响应。我想知道我是否应该实施这个逻辑,而不是试图解释不同的反应? – filmplane

+1

如果你得到4xx错误,那么我会说正确的答案是记录错误并失败。用错误调用回调会阻止瀑布,从停止发布。然后setInterval稍后再运行。 – mdickin

+0

我刚刚在异步文档中发现了这个:https://github.com/caolan/async#retry – filmplane

相关问题