在nodejs中存储数据库查询(使用socket.io)

在nodejs中存储数据库查询(使用socket.io)

问题描述:

我的代码有一个(可能是哑巴)问题。我有这样的事情:在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查询)是异步的,但我似乎无法弄清楚如何使这项工作。任何帮助将不胜感激。

在对集合的查询完成之前,您正在发出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