【发布时间】:2015-05-01 21:18:08
【问题描述】:
如何更改我的数据库连接调用中的内容,以便我可以执行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 示例要么只是在连接回调中进行所有调用,要么使用诸如 Express 之类的框架并在启动时分配它。
【问题讨论】:
-
恐怕不行,否则你怎么知道连接是成功异步建立的?
-
@SecondRikudo - 连接在那里,因为我总是打电话给
getDb- 查看我的编辑。建立连接不是问题 - 主要是清理。 -
为了清理,bluebird提供
.dispose()。
标签: javascript mongodb promise bluebird