これが私が思いついた解決策です。
mongojs を使用しました これにより、mongodbインターフェースが大幅に簡素化されますが、構成の柔軟性が犠牲になりますが、mongodbドライバーが必要とするネストされたコールバックが非表示になります。また、構文がmongoクライアントに非常に似たものになります。
次に、HTTP Responseオブジェクトをクロージャでラップし、このクロージャをコールバックでmongodbクエリメソッドに渡します。
var MongoProvider = require('./MongoProvider');
MongoProvider.setCollection('things');
exports.index = function(request, response){
function sendResponse(err, data) {
if (err) {
response.send(500, err);
}
response.send(data);
};
MongoProvider.fetchAll(things, sendResponse);
};
基本的には、応答オブジェクトをデータベースプロバイダーに渡すだけですが、応答の処理方法を知っているクロージャーでラップすることにより、そのロジックをデータベースモジュールから除外します。
わずかな改善点は、関数を使用して、リクエストハンドラーの外部にレスポンスハンドラークロージャーを作成することです。
function makeSendResponse(response){
return function sendResponse(err, data) {
if (err) {
console.warn(err);
response.send(500, {error: err});
return;
}
response.send(data);
};
}
これで、リクエストハンドラは次のようになります:
exports.index = function(request, response) {
response.send(makeSendResponse(response));
}
そして、私のMongoProviderは次のようになります:
var mongojs = require('mongojs');
MongoProvider = function(config) {
this.configure(config);
this.db = mongojs.connect(this.url, this.collections);
}
MongoProvider.prototype.configure = function(config) {
this.url = config.host + "/" + config.name;
this.collections = config.collections;
}
MongoProvider.prototype.connect = function(url, collections) {
return mongojs.connect(this.url, this.collections);
}
MongoProvider.prototype.fetchAll = function fetchAll(collection, callback) {
this.db(collection).find(callback);
}
MongoProvider.prototype.fetchById = function fetchById(id, collection, callback) {
var objectId = collection.db.bson_serializer.ObjectID.createFromHexString(id.toString());
this.db(collection).findOne({ "_id": objectId }, callback);
}
MongoProvider.prototype.fetchMatches = function fetchMatches(json, collection, callback) {
this.db(collection).find(Json.parse(json), callback);
}
module.exports = MongoProvider;
特定のコレクション用にMongoProviderを拡張して、APIを簡素化し、追加の検証を行うこともできます。
ThingsProvider = function(config) {
this.collection = 'things';
this.mongoProvider = new MongoProvider(config);
things = mongoProvider.db.collection('things');
}
ThingsProvider.prototype.fetchAll = function(callback) {
things.fetchAll(callback);
}
//etc...
module.exports = ThingsProvider;