如何更改数据库连接调用中的内容,以便我可以执行db.collection()
:
// Create a Mongo connection
Job.prototype.getDb = function() {
if (!this.db)
this.db = Mongo.connectAsync(this.options.connection);
return this.db;
};
// I want to be able to do this
Job.prototype.test = function() {
return this.db.collection('abc').findAsync()...
};
// Instead of this
Job.prototype.test = function() {
return this.getDb().then(function(db) {
return db.collection('abc').findAsync()...
});
};
我的代码始终调用getDb
,因此创建连接时不会出现问题。例如:
this.getDb().then(test.bind(this));
但是我实际上把这些调用串起来,所以寻找更清洁的方法。
这很有效 - 只是想知道是否有更好的方法来解决这个问题。
Job.prototype.getDb = function(id) {
var self = this;
return new P(function(resolve, reject) {
if (!self.db) {
return Mongo.connectAsync(self.options.connection)
.then(function(c) {
self.db = c;
debug('Got new connection');
resolve(c);
});
}
debug('Got existing connection');
resolve(self.db);
});
};
我认为这实际上只是一个mongo连接问题,也许不仅仅是承诺。我看到的所有Mongo示例都只是在connect回调中进行所有调用,或者使用像Express这样的框架并在启动时分配它。
答案 0 :(得分:3)
我希望能够做到这一点
return this.db.collection('abc').findAsync()
不,当您不知道数据库是否已连接时,这是不可能的。如果您可能首先需要连接,并且这是异步的,那么this.db
必须产生承诺,您需要使用then
。
请注意,使用Bluebird,您可以稍微缩短该代码,并使用.call()
method避免该详细的.then()
回调:
Job.prototype.getDb = function() {
if (!this.db)
this.db = Mongo.connectAsync(this.options.connection);
return this.db;
};
Job.prototype.test = function() {
return this.getDb().call('collection', 'abc').call('findAsync');
};