Inilah solusi yang saya buat.
Saya menggunakan mongojs yang sangat menyederhanakan antarmuka mongodb --dengan biaya fleksibilitas dalam konfigurasi-- tetapi ia menyembunyikan panggilan balik bersarang yang dibutuhkan driver mongodb. Itu juga membuat sintaks lebih mirip klien mongo.
Saya kemudian membungkus objek Respons HTTP dalam suatu penutupan dan meneruskan penutupan ini ke metode kueri mongodb dalam suatu panggilan balik.
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);
};
Itu pada dasarnya masih hanya meneruskan objek respons ke penyedia basis data, tetapi dengan membungkusnya dalam penutupan yang tahu bagaimana menangani respons, itu membuat logika itu keluar dari modul basis data saya.
Sedikit peningkatan adalah dengan menggunakan fungsi untuk membuat penutupan penangan respons di luar penangan permintaan saya:
function makeSendResponse(response){
return function sendResponse(err, data) {
if (err) {
console.warn(err);
response.send(500, {error: err});
return;
}
response.send(data);
};
}
Jadi sekarang penangan permintaan saya hanya terlihat seperti ini:
exports.index = function(request, response) {
response.send(makeSendResponse(response));
}
Dan MongoProvider saya terlihat seperti ini:
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;
Saya juga dapat memperluas MongoProvider untuk koleksi tertentu guna menyederhanakan API dan melakukan validasi tambahan:
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;