2013-03-06 24 views
0

中使用流API发送推文我正在与Twit一起获得围绕Twitter API的很好包装。我有一个cron来获取特定hashtag上的所有推文。每当有新的推文时,它就递增计数器,并在期末将其保存到数据库(MongoDB)中。唯一的问题是,它总是返回我0.
下面是代码不要在节点

new cronJob('00 */5 * * * *', function(){ // start parsing 5mn after call, and every 5mn then 
     var stream = T.stream('statuses/filter', { track: 'hashtag' }) 
     var counter = 0; 
     var date = new Date(); 
     var collection = client.collection("TweetsNumber"); 

     stream.on('tweet', function (tweet) { 
      console.log(tweet); 
      counter += 1; 
     }) 

     collection.insert({Date: date, CrawledTweets: counter, Channel: "someChannel"}); 
     console.log(counter + " tweets saved in DB"); 

    }, null, true, "Europe/Paris"); 

根据该文档中,“stream.on”方法被调用每次有新的鸣叫。我使用一些热门话题来确保有数据,但它就像从未被调用过,我真的不知道为什么。
希望你能帮上忙。祝你有美好的一天 !

编辑:T已经在程序的另一部分创建,并与其他功能,它工作。客户端,这是我的分贝。

编辑:谢谢Shodan,它现在有效,请参阅github issue。非常感谢 !

+0

我不能找到在这段代码中有一个问题,你可以尝试使用'setInterval'替换cron来检查cronJob是否有问题吗? – pfried 2013-03-06 08:58:47

+0

我知道它正在工作,我每隔5分钟就得到最后一个console.log。 – Simon 2013-03-06 09:00:02

+0

是的,我知道,我想保持执行上下文更接近'T'对象,因为我不知道cronJob的执行上下文很多 – pfried 2013-03-06 09:02:33

回答

1

推文是否记录到您的控制台?

如果是的话,那么这不是一个问题,因为它完全按照你所说的去做。

当我正确读取您的代码时,您将创建一个cronjob,每5分钟触发一次。

  • 它连接一个新的本地流,它应该输出到控制台并增加计数器在接下来的5分钟。
  • 它插入到全球client.collection("TweetNumbers"),与具有局部变量计数器0
  • console.log(counter + " tweets saved in DB");值,与局部变量计数器为0
  • 该函数然后退出值,中新开始5分钟。

  • stream.on在接下来的5分钟内出现tweet时会继续触发并增加计数器,但计数器不会再被collection.insert和第二个console.log再次使用。

这是因为你重新启动函数为所有东西创建新的局部变量并重新记录初始值。

+0

不,鸣叫不记录,这是公关oblem。 这并不完全是我想要做的。 我想在每次发布推文时增加计数器,并在5分钟后保存此数字,然后再次执行。我想你可以声明var然后增加,它会存储在我们的流中,但也许它在Node中不起作用,因为语言的特殊性,如果是这样,一个指示如何做到这一点的指针非常感谢:D – Simon 2013-03-06 21:43:06

+0

我认为问题在于,当函数退出时,用于存储流对象的局部变量''stream''将被销毁,因此在事件循环的下一个记号中没有流可以发射任何东西的物体。 在github上检查你的问题,我写了一些应该解决你的问题的示例代码。 (虽然没有测试过。) – Kai 2013-03-07 02:45:23

1

您设置了var counter = 0,然后立即console.log()它,这意味着'鸣叫'事件永远不会有机会触发和增加计数器。你可能会想这样做:

新的cronjob(00 */5 * * * * '函数(){//开始解析调用后5MN,每5MN然后 VAR流= T.stream('状态/过滤器”,{轨道: '#标签'}) VAR计数器= 0; 变种日期=新日期(); VAR集合= client.collection( “TweetsNumber”);

stream.on('tweet', function (tweet) { 
     console.log(tweet); 

     collection.insert({Date: date, CrawledTweets: counter, Channel: "someChannel"}); 
     counter += 1; 

     console.log(counter + " tweets saved in DB"); 
    }) 
}, null, true, "Europe/Paris"); 
+0

我试过这段代码,并没有得到console.log:/我试图在流事件之前放一个,并且它很好,所以它就像事件stream.on没有被触发。 – Simon 2013-03-06 21:40:23