db.open(function(err,db){
//handle error
db.collection("book",function(err, collection){
//handle error
collection.doSomething1(... function(err, result){
//handle error
collection.doSomething2(... function(err, result){
...
})
})
})
})但我们不会在每次想做某事的时候都写db.open,但我们必须确保在使用db时已经打开了它。
我们仍然不喜欢每次在相同的代码中处理错误。
我们也可以重用这个集合。
就像这样
errorHandledDB.doSomething1("book",... function(result){
errorHandledDB.doSomething2("book",...function(result){
...
})
})发布于 2011-04-08 10:04:09
回答我自己的问题。因为没有更好的选择,所以我自己做,我开始了一个项目来简化它,检查node-mongoskin。
发布于 2011-02-28 16:19:19
我使用mongodb实现了一个用于日志记录的服务器应用程序。我使用一些提供程序类实现了数据访问,如示例中所示。
provider.filelog.js
var Db= require('mongodb/db').Db,
ObjectID= require('mongodb/bson/bson').ObjectID,
Server= require('mongodb/connection').Server,
log = require('lib/common').log;
FilelogProvider = function (host, port, database) {
this.db= new Db(database, new Server(host, port, {auto_reconnect: true}, {}));
this.db.open(function(){});
};
FilelogProvider.prototype.getCollection= function(callback) {
this.db.collection('filelogs', function(error, log_collection) {
if (error) callback(error);
else {
log_collection.ensureIndex([[ 'created', 1 ]], false, function(err, indexName) {
if (error) callback(error);
callback(null, log_collection);
});
}
});
};
FilelogProvider.prototype.findAll = function(callback) {
this.getCollection(function(error, log_collection) {
if (error) callback(error);
else {
log_collection.find(function(error, cursor) {
if (error) callback(error);
else {
cursor.toArray(function(error, results) {
if (error) callback(error);
else callback(null, results);
});
}
});
}
});
};因为我使用Grasshopper作为我的http中间件,所以我可以使用gh提供的DI功能轻松地注入提供者:
server.js
gh.addToContext({
providers: {
filelog: new FilelogProvider(conf.mongodb_host, conf.mongodb_port, conf.mongodb_database),
status: new ServerstatusProvider(conf.mongodb_host, conf.mongodb_port, conf.mongodb_database)
},
log: log
});访问每个控制器函数中的提供程序现在轻而易举:
gh.get('/serve', function() {
this.providers.filelog.findAll(function(err, res) {
// access data here
});
});这个实现是针对Grasshopper的(因为它使用了DI),但是我想你会明白的。我还用express和mongoose实现了一个解决方案,你会发现它是here的。此解决方案比使用本机驱动程序要干净一些,因为它公开了要针对数据库使用的模型。
更新
只是为了它:如果你真的想坚持DRY原则,那就停止自己在ORM实现上的修修补补,而使用Mongoose。如果你需要像Map/Reduce这样的特殊功能,你仍然可以使用本地驱动程序( Mongoose就是在这个驱动程序上构建的)。
发布于 2011-03-09 06:45:03
我在这里说的是理论上的,与mongo无关。
我建议您尝试构建一种包装。
数据访问层或至少是模型,这完全取决于您的体系结构和需求,这在您这边。
只需用一层抽象命令包装对mongodb的访问,然后编写一个抽象模型对象,所有其他模型对象都将继承它,并将自动为您从mongo数据库中提取的记录的属性设置所有的getter和setter。
对于更新,只需给它一个save方法,该方法迭代并保存对它所做的所有更改。
因为它不是关系型的,而且我不知道它是否适合您的设计,所以这个模型在这里可能没有用。
希望这会有帮助,祝你好运!
https://stackoverflow.com/questions/5139429
复制相似问题