在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();
}
});
}
对不起,坏。我实际上是这样做的,我在问题中输入了错误的代码。它仍然不起作用。 – 2012-08-03 21:27:40
您是否确定*您所显示的代码正好*您正在运行的代码?不要将代码重新输入问题;请将其复制并粘贴。否则,你会冒着输入你认为你的代码是什么的风险,而不是它实际是什么,它可以隐藏错误。 – ebohlman 2012-08-04 04:44:30
是的,我很确定 – 2012-08-12 07:29:55