【问题标题】:Storing db queries in nodejs (with socket.io)在 nodejs 中存储数据库查询(使用 socket.io)
【发布时间】:2012-08-03 20:50:34
【问题描述】:

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

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] 已被初始化为[],但它不包含之后分配给它的数据。

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

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

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    您在对集合的查询完成之前发出 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();
            }
        });
    }
    

    【讨论】:

    • 对不起,很糟糕。我实际上正在这样做,我在问题中输入了错误的代码。还是不行。
    • 确定您显示的代码正是您正在运行的代码吗?不要在问题中重新输入代码;而是复制并粘贴它。否则,您可能会输入您认为的代码而不是实际代码,这可能会隐藏错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多