2012-08-03 88 views
0

我的代碼有一個(可能是啞巴)問題。我有這樣的事情:在nodejs中存儲數據庫查詢(使用socket.io)

io.sockets.on('connection', function(socket) 
{ 
    var list = {}; 

    socket.on('event', function(data){ 
     if(!list[data.field_name]){ 
      list[data.field_name] = []; 
      // db and collection already defined 
      var collection = new mongodb.Collection(db, coll); 
      collection.find({ 
       field: data.field_name, 
      }).toArray(function(err, results){ 
       list[data.field_name] = results[results.length-1]; 
       socket.emit('another-event',{ 
        list:list[data.field_name]; 
       }); 
      }); 
     } else { 
      socket.emit('another-event',{ 
       list:list[data.field_name]; 
      }); 
     } 

    }); 
} 

基本上,我想緩存在列表中的DB的結果,並直接發送(不分貝查詢),如果它已經從數據庫中檢索較早。

我遇到的問題是,作業list[data.field_name] = results[results.length-1]不起作用。因此,如果之前嘗試檢索數據,則list[data.field_name]已初始化爲[],但它不包含之後分配給它的數據。

要清楚的是,它確實從數據庫中檢索數據,並在從數據庫檢索到數據時第一次將數據發送到客戶端。當我嘗試發送問題出現的緩存副本時 - 沒有緩存副本。

我知道這是與nodejs(和mongodb查詢)是異步的,但我似乎無法弄清楚如何使這項工作。任何幫助將不勝感激。

回答

0

在對集合的查詢完成之前,您正在發出another-event。如果在發射another-event時尚未檢索到數據,則list[data.field_name]仍將爲空。嘗試像這樣:

io.sockets.on('connection', function(socket) 
{ 
    var list = {}; 

    socket.on('event', function(data){ 
     var anotherEvent = function() { 
      socket.emit('another-event',{ 
       list:list[data.field_name]; 
      }); 
     }; 

     if(!list[data.field_name]){ 
      list[data.field_name] = []; 
      // db and collection already defined 
      var collection = new mongodb.Collection(db, coll); 
      collection.find({ 
       field: data.field_name, 
      }).toArray(function(err, results){ 
       list[data.field_name] = results[results.length-1]; 
       anotherEvent(); 
      }); 
     } else { 
      anotherEvent(); 
     } 
    }); 
} 
+0

對不起,壞。我實際上是這樣做的,我在問題中輸入了錯誤的代碼。它仍然不起作用。 – 2012-08-03 21:27:40

+0

您是否確定*您所顯示的代碼正好*您正在運行的代碼?不要將代碼重新輸入問題;請將其複製並粘貼。否則,你會冒着輸入你認爲你的代碼是什麼的風險,而不是它實際是什麼,它可以隱藏錯誤。 – ebohlman 2012-08-04 04:44:30

+0

是的,我很確定 – 2012-08-12 07:29:55

相關問題