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

Storing db queries in nodejs (with socket.io)

本文关键字:使用 socket io nodejs 数据库 查询 存储      更新时间:2023-09-26

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

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

我基本上是在尝试将数据库结果缓存在列表中,并直接发送它(不带数据库查询),如果它之前已经从数据库中检索到的话。

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

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

我知道这与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();
        }
    });
}