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

Javascript 在nodejs中存储数据库查询(使用socket.io),javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我的代码有一个(可能是愚蠢的)问题。我有这样的想法: 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

我的代码有一个(可能是愚蠢的)问题。我有这样的想法:

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结果缓存在列表中,并直接发送它(无需db查询),前提是之前已经从数据库中检索到它

我遇到的问题是赋值
list[data.field\u name]=results[results.length-1]
不起作用。因此,如果它以前试图检索数据,
list[data.field\u name]
已初始化为
[]
,但它不包含之后分配给它的数据

明确地说,它确实从数据库中检索数据,并在第一次从数据库检索数据时将其正确地发送给客户机。当我尝试发送缓存副本时,问题就出现了——没有缓存副本


我知道这与nodejs(和mongodb查询)是异步的有关,但我似乎不知道如何使其工作。任何帮助都将不胜感激。

在对集合的查询完成之前,您正在发出另一个事件。如果在发出另一个事件时未检索到数据,则
列表[数据.字段\u名称]
仍将为空。尝试以下方法:

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();
        }
    });
}

对不起,糟了。我实际上是这样做的,我在问题中输入了错误的代码。它仍然不起作用。您确定您显示的代码正是您正在运行的代码吗?不要在问题中重新输入代码;复制并粘贴它。否则,您将面临键入您认为的代码而不是实际代码的风险,这可能会隐藏错误。