首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用node-mongodb-native时保持干燥

如何在使用node-mongodb-native时保持干燥
EN

Stack Overflow用户
提问于 2011-02-28 15:56:14
回答 3查看 2.8K关注 0票数 8
代码语言:javascript
复制
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时已经打开了它。

我们仍然不喜欢每次在相同的代码中处理错误。

我们也可以重用这个集合。

就像这样

代码语言:javascript
复制
errorHandledDB.doSomething1("book",... function(result){
    errorHandledDB.doSomething2("book",...function(result){
        ...
    })
})
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-08 10:04:09

回答我自己的问题。因为没有更好的选择,所以我自己做,我开始了一个项目来简化它,检查node-mongoskin

票数 1
EN

Stack Overflow用户

发布于 2011-02-28 16:19:19

我使用mongodb实现了一个用于日志记录的服务器应用程序。我使用一些提供程序类实现了数据访问,如示例中所示。

provider.filelog.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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
});

访问每个控制器函数中的提供程序现在轻而易举:

代码语言:javascript
复制
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就是在这个驱动程序上构建的)。

票数 2
EN

Stack Overflow用户

发布于 2011-03-09 06:45:03

我在这里说的是理论上的,与mongo无关。

我建议您尝试构建一种包装。

数据访问层或至少是模型,这完全取决于您的体系结构和需求,这在您这边。

只需用一层抽象命令包装对mongodb的访问,然后编写一个抽象模型对象,所有其他模型对象都将继承它,并将自动为您从mongo数据库中提取的记录的属性设置所有的getter和setter。

对于更新,只需给它一个save方法,该方法迭代并保存对它所做的所有更改。

因为它不是关系型的,而且我不知道它是否适合您的设计,所以这个模型在这里可能没有用。

希望这会有帮助,祝你好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5139429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档