2013-03-06 69 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