Как сохранить DRY при использовании node-mongodb-native - PullRequest
8 голосов
/ 28 февраля 2011
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){
        ...
    })
})

Ответы [ 3 ]

2 голосов
/ 28 февраля 2011

Я реализовал серверное приложение, используя 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-промежуточного программного обеспечения, я могу легко внедрить поставщиков, используя функциональность DI, предоставляемую gh:

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, вы найдете его здесь . Это решение немного чище, чем использование собственного драйвера, поскольку оно предоставляет модели для использования в базе данных.

Обновление

Просто ради этого: если вы действительно хотите придерживаться принципа DRY, прекратите возиться с реализацией ORM самостоятельно и используйте Mongoose . Если вам нужны специальные функции, такие как Map / Reduce, вы все равно можете использовать собственный драйвер (на котором построен Mongoose).

1 голос
/ 08 апреля 2011

Ответь на мой вопрос.Поскольку хороших вариантов больше нет, я делаю это сам, запускаю проект для его упрощения, проверяю node-mongoskin .

0 голосов
/ 09 марта 2011

Я говорю здесь теоретически, безотносительно к монго.

Я бы порекомендовал вам попробовать создать такую ​​упаковку.

Уровень доступа к данным или, по крайней мере, модели, все зависит от вашей архитектуры и потребностей, и это на вашей стороне.

Просто оберните доступ к mongodb слоем абстрактных команд, затем напишите объект абстрактной модели, и все другие объекты модели будут наследовать его, и он автоматически установит все методы получения и установки для атрибутов записи, которую вы извлекли из монго дб.

для обновления вы просто даете ему метод сохранения, который повторяет и сохраняет все сделанные в нем изменения.

Поскольку это не реляционная система, и я не знаю, хорошо ли она подходит для вашего дизайна, модель здесь может оказаться бесполезной.

Надеюсь, это поможет, Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...