如何处理node.js node-mongodb中的连接和查询队列?

时间:2012-09-13 11:31:35

标签: javascript node.js mongodb

我不清楚如何处理该连接并查询该集合。 因为有时连接已经存在并且没有问题。但是当需要建立连接时,集合查询不会排队。 您也无法始终建立新连接,因为您可以(并且应该)只创建一个连接。 看起来您需要在连接回调中使用集合查询,但在连接已经存在时也是独立的。

当然,这不是可以撤销的,但是由于所有的blah和yaddah开销,我想我做得不对。 毕竟,这对我来说似乎有点 syntactic saccharin syntactic sugar在哪里?

这是一个基本的例子。想象一下同一秒钟中的一堆请求:

var util        = require('util'),
    mongo       = require('mongodb'),
    Server      = mongo.Server,
    Db          = mongo.Db,
    mServer     = new Server('localhost', 27017),
    mDb         = new Db('SomeDatabase', mServer),
    db;

if (mDb._state == 'disconnected') {
    util.debug('MONGODB: connecting...');
    mDb.open(function(err, newDb) {
        if (!err) {
            db = newDb;
            // I cannot immediately work on a collection here, 
            // because it takes a moment for the db to connect.
        }
    });
}
else if (mDb._state == 'connecting') {
    // I need to catch this state because I cannot work on collections yet, 
    // but I cannot connect either because it's already connecting.
}
// else if (mDb._state == 'connected') {

// Queries need to be performed after connection is established 
// or when connection was already established by a previous request.
db.createCollection(collection, function(err, collection) {
    if (!err) {
        collection.insert(record, {safe:true}, function(err, result) {
            util.debug('MONGODB: Inserted.');
        });
    }
});

// }

现在,我发现的初学者指南都是关于mDb.open的回调,但是当节点已经运行时,这会给连续请求带来问题。它拒绝打开另一个连接。 那么,当单个启动回调不够时,在nodejs 中使用mongodb的正确方法是什么?

我想象一个模块,你以回调形式传递查询,它会为你传递回调,(1)到等待连接回调的地方,(2)直接到集合,或者(3)等待连接,但连接回调为时已晚。但就像我说的,这是纯粹的语法糖精。

1 个答案:

答案 0 :(得分:1)

你误会了什么。首先,您创建与DB的连接:

var mDb = new Db('SomeDatabase', mServer);

并保留对此连接的引用。每当您想要从/向DB加载/保存内容时,都使用相同的变量。您不会在每个请求上重新创建它。甚至在创建Web服务器本身之前就应该进行初始化(在open回调上创建服务器)。这是一个伪代码:

var webserver = INITIALIZE_NEW_SERVER( );
var mDB = new Db('SomeDatabase', mServer);

// set request handler
WHEN_REQUEST ---> {
    mDB.createCollection( ... );
    // whatever
}

mDb.open(function(error, newDb) {
    // handle errors
    webserver.listen( );
});