Ответ 1
mydb.js
:
var mongodb= require('mongodb'),
server = new mongodb.Server('staff.mongohq.com', 10030, {
auto_reconnect: true
}),
db1 = new mongodb.Db('mydb', server);
// callback: (err, db)
function openDatabase(callback) {
db1.open(function(err, db) {
if (err)
return callback(err);
console.log('Database connected');
return callback(null, db);
});
}
// callback: (err, collection)
function authenticate(db, username, password, callback) {
db.authenticate(username, password, function(err, result) {
if (err) {
return callback (err);
}
if (result) {
var collection = new mongodb.Collection(db, 'test');
// always, ALWAYS return the error object as the first argument of a callback
return callback(null, collection);
} else {
return callback (new Error('authentication failed'));
}
});
}
exports.openDatabase = openDatabase;
exports.authenticate = authenticate;
use.js
:
var mydb = require('./mydb');
// open the database once
mydb.openDatabase(function(err, db) {
if (err) {
console.log('ERROR CONNECTING TO DATABASE');
console.log(err);
process.exit(1);
}
// authenticate once after you opened the database. What the point of
// authenticating on-demand (for each query)?
mydb.authenticate(db, 'usernsame', 'password', function(err, collection) {
if (err) {
console.log('ERROR AUTHENTICATING');
console.log(err);
process.exit(1);
}
// use the returned collection as many times as you like INSIDE THE CALLBACK
collection.find({}, {limit: 10})
.toArray(function(err, docs) {
console.log('\n------ 1 ------');
console.log(docs);
});
collection.find({}, {limit: 10})
.toArray(function(err, docs) {
console.log('\n------ 2 ------');
console.log(docs);
});
});
});
Результат:
успеха:
Database connected Database user authenticated ------ 1 ------ [ { _id: 4f86889079a120bf04e48550, asd: 'asd' } ] ------ 2 ------ [ { _id: 4f86889079a120bf04e48550, asd: 'asd' } ]
при сбое:
Database connected { [MongoError: auth fails] name: 'MongoError', errmsg: 'auth fails', ok: 0 }
[Исходный ответ]:
Вы открываете db
несколько раз (один раз в каждом query
). Вы должны открыть базу данных только один раз и использовать объект db
в обратном вызове для последующего использования.
Вы используете одно и то же имя переменной несколько раз, и это могло вызвать некоторую путаницу.
var mongodb = require('mongodb'),
server = new mongodb.Server('staff.mongohq.com', 10030, {
auto_reconnect: true
}),
db1 = new mongodb.Db('mydb', server);
function authenticateAndGo(db, handle) {
db.authenticate('username', 'password', function(err) {
if (err) {
console.log(err);
return;
}
console.log('Database user authenticated');
var collection = new mongodb.Collection(db, 'test');
handle(collection);
});
}
function query(handle) {
db1.open(function(err, db2) {
if( err ) {
console.log(err);
return;
}
console.log('Database connected');
authenticateAndGo(db2, handle);
});
};
exports.query = query;
Я немного изменил приведенный выше код (db1
для исходного db, db2
для открытого db). Как вы можете видеть, вы открываете db1
несколько раз, что плохо. извлеките код для открытия в другой метод и используйте его ONCE и используйте экземпляр db2
для всех ваших запросов/обновлений/удалений/...