Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js重用MongoDB参考_Node.js_Mongodb - Fatal编程技术网

Node.js重用MongoDB参考

Node.js重用MongoDB参考,node.js,mongodb,Node.js,Mongodb,我无法理解node.js 例如,MongoDB access,下面是我得到的(mydb.js): 所以,如果我以后想用它,我会 var mydb = require('./mydb'); mydb.query(function(collection) { collection.find({}, { limit: 10 }).toArray(function(err, docs) { console.log(docs); }); }); 但

我无法理解node.js

例如,MongoDB access,下面是我得到的(mydb.js):

所以,如果我以后想用它,我会

var mydb = require('./mydb');
mydb.query(function(collection) {
    collection.find({}, {
        limit: 10
    }).toArray(function(err, docs) {
        console.log(docs);
    });
});
但是,如果我打多个电话,比如:

var mydb = require('./mydb');
mydb.query(function(collection) {
    collection.find({}, {
        limit: 10
    }).toArray(function(err, docs) {
        console.log(docs);
    });
});
mydb.query(function(collection) {
    collection.find({}, {
        limit: 10
    }).toArray(function(err, docs) {
        console.log(docs);
    });
});
我得到一个例外:

Error: db object already connecting, open cannot be called multiple times
我认为,关于这一切,我真的有一些根本性的东西不明白,很可能这个问题很愚蠢

不管怎样,欢迎大家帮忙

提前感谢。

mydb.js

var mongodb=require('mongodb'),
server=newmongodb.server('staff.mongohq.com',10030{
自动重新连接:true
}),
db1=新的mongodb.Db('mydb',server);
//回调:(err,db)
函数openDatabase(回调){
db1.open(函数(err,db){
如果(错误)
返回回调(err);
log('Database connected');
返回回调(null,db);
});
}
//回调:(错误,集合)
函数身份验证(数据库、用户名、密码、回调){
身份验证(用户名、密码、函数(错误、结果){
如果(错误){
返回回调(err);
}
如果(结果){
var collection=newmongodb.collection(db,‘test’);
//始终,始终将错误对象作为回调的第一个参数返回
返回回调(空,集合);
}否则{
返回回调(新错误(“身份验证失败”);
}
});
}
exports.openDatabase=openDatabase;
exports.authenticate=验证;
use.js

var mydb=require('./mydb');
//打开数据库一次
openDatabase(函数(err,db){
如果(错误){
log('连接到数据库时出错');
控制台日志(err);
过程。退出(1);
}
//在打开数据库后进行一次身份验证。这有什么意义
//按需验证(针对每个查询)?
mydb.authenticate(数据库,'usernsame','password',函数(err,collection){
如果(错误){
log('ERROR authentication');
控制台日志(err);
过程。退出(1);
}
//在回调中,尽可能多次使用返回的集合
collection.find({},{limit:10})
.toArray(函数(错误、文档){
console.log('\n------1------');
console.log(文档);
});
collection.find({},{limit:10})
.toArray(函数(错误、文档){
console.log('\n------2------');
console.log(文档);
});
});
});
结果: 关于成功:

发生故障时:


[原答覆]:

您多次打开
db
(每次
查询一次)。您应该只打开数据库一次,然后在回调中使用
db
对象供以后使用

您多次使用同一个变量名,这可能会造成一些混乱

var mongodb=require('mongodb'),
server=newmongodb.server('staff.mongohq.com',10030{
自动重新连接:true
}),
db1=新的mongodb.Db('mydb',server);
函数authenticateAndGo(数据库,句柄){
db.authenticate('username','password',函数(err){
如果(错误){
控制台日志(err);
返回;
}
log('Database user authenticated');
var collection=newmongodb.collection(db,‘test’);
处理(收集);
});
}
函数查询(句柄){
open(函数(err,db2){
如果(错误){
控制台日志(err);
返回;
}
log('Database connected');
authenticateAndGo(db2,句柄);
});
};
exports.query=查询;
我对上面的代码做了一些修改(
db1
用于原始数据库,
db2
用于打开的数据库)。如您所见,您多次打开了
db1
,这是不好的。将用于打开的代码提取到另一个方法中并使用一次,然后将
db2
实例用于所有查询/更新/删除/…

您只能调用“打开”一次。当OpenCallback启动时,您可以对它返回的DB对象执行查询。因此,处理这个问题的一种方法是将请求排队,直到打开完成。 e、 g MyMongo.js

var mongodb = require('mongodb');

function MyMongo(host, port, dbname) {
    this.host = host;
    this.port = port;
    this.dbname = dbname;

    this.server = new mongodb.Server(
                              'localhost', 
                              9000, 
                              {auto_reconnect: true});
    this.db_connector = new mongodb.Db(this.dbname, this.server);

    var self = this;

    this.db = undefined;
    this.queue = [];

    this.db_connector.open(function(err, db) {
            if( err ) {
                console.log(err);
                return;
        }
        self.db = db;
        for (var i = 0; i < self.queue.length; i++) {
            var collection = new mongodb.Collection(
                                 self.db, self.queue[i].cn);
            self.queue[i].cb(collection);
        }
        self.queue = [];

    });
}
exports.MyMongo = MyMongo;

MyMongo.prototype.query = function(collectionName, callback) {
    if (this.db != undefined) {
        var collection = new mongodb.Collection(this.db, collectionName);
        callback(collection);
        return;
    }
    this.queue.push({ "cn" : collectionName, "cb" : callback});
}

我只需在db init之后直接调用open函数一次:

var mongodb = require('mongodb');
var server = new mongodb.Server('foo', 3000, {auto_reconnect: true});
var db = new mongodb.Db('mydb', server);   
db.open(function(){});
在那之后,我不必再关心这些了,因为自动重新连接是真的

db.collection('bar', function(err, collection) { [...] };

您可能希望签出通用池以维护数据库连接池。它们都在不同的作用域中@TupakGoliam:是的,我的意思是他们可能会让你在精神上感到困惑(看看代码并理解它)。我将在稍后更改我的答案,以获得一个完整且有效的示例。@TupakGoliam我现在更改我的答案。如果不起作用,请告诉我。我添加了很多注释,修改了代码的结构,使其更加标准。这有点复杂,我认为是,一个简单的任务。。。我自己排队请求。。。MongoDB/node MongoDB native不支持这类东西吗?问题是MongoDB.js只允许调用一次“open”,并且在打开完成之前不能使用该连接。因此,您需要某种方法来跟踪open是否已被调用,并在连接准备就绪之前避免使用连接。因此,你要么需要通过应用程序中的控制流来管理它(例如,在开放回调中执行所有操作),要么保留一些额外的状态来为你管理它(上面的对象/队列)+1,因为它修复了我遇到的一个恼人的问题,回答很好。我认为代码不起作用,因为我已经检查了好几次。db.open需要时间来执行,因此无法使用它。因此,您必须在回调方法中使用它。
var mongodb = require('mongodb');

function MyMongo(host, port, dbname) {
    this.host = host;
    this.port = port;
    this.dbname = dbname;

    this.server = new mongodb.Server(
                              'localhost', 
                              9000, 
                              {auto_reconnect: true});
    this.db_connector = new mongodb.Db(this.dbname, this.server);

    var self = this;

    this.db = undefined;
    this.queue = [];

    this.db_connector.open(function(err, db) {
            if( err ) {
                console.log(err);
                return;
        }
        self.db = db;
        for (var i = 0; i < self.queue.length; i++) {
            var collection = new mongodb.Collection(
                                 self.db, self.queue[i].cn);
            self.queue[i].cb(collection);
        }
        self.queue = [];

    });
}
exports.MyMongo = MyMongo;

MyMongo.prototype.query = function(collectionName, callback) {
    if (this.db != undefined) {
        var collection = new mongodb.Collection(this.db, collectionName);
        callback(collection);
        return;
    }
    this.queue.push({ "cn" : collectionName, "cb" : callback});
}
var MyMongo = require('./MyMongo.js').MyMongo;

var db = new MyMongo('localhost', 9000, 'db1');
var COL = 'col';

db.query(COL, function(collection) {
    collection.find({}, {
        limit: 10
    }).toArray(function(err, docs) {
        console.log("First:\n", docs);
    });
});


db.query(COL, function(collection) {
    collection.find({}, {
        limit: 10
    }).toArray(function(err, docs) {
        console.log("\nSecond:\n", docs);
    });
});
var mongodb = require('mongodb');
var server = new mongodb.Server('foo', 3000, {auto_reconnect: true});
var db = new mongodb.Db('mydb', server);   
db.open(function(){});
db.collection('bar', function(err, collection) { [...] };