0

我不清楚如何使用该连接和查询集合。因为有时连接已经存在并且没有问题。但是当需要建立连接时,集合查询不会排队。你也不能一直建立新的联系,因为你可以(而且应该)只建立一个。似乎您需要在连接回调中进行集合查询,但在连接已经存在时也需要独立。

当然,这是不可撤消的,但是由于开销很大,我想我做得不对。毕竟,这对我来说似乎有点句法糖精语法糖在哪里?

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

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)等待连接,但连接回调为时已晚。但就像我说的,这是纯粹的句法糖精。

4

1 回答 1

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( );
});
于 2012-09-13T12:40:09.170 回答