Я реализовал серверное приложение, используя 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).