Đây là giải pháp mà tôi đã đưa ra.
Tôi đã sử dụng mongojs điều này giúp đơn giản hóa đáng kể giao diện mongodb - với chi phí linh hoạt trong cấu hình - nhưng nó ẩn các lệnh gọi lại lồng nhau mà trình điều khiển mongodb yêu cầu. Nó cũng làm cho cú pháp giống với ứng dụng khách mongo hơn.
Sau đó, tôi bọc đối tượng Phản hồi HTTP trong một bao đóng và chuyển bao đóng này tới phương thức truy vấn mongodb trong một lệnh gọi lại.
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);
};
Về cơ bản, nó vẫn chỉ chuyển đối tượng phản hồi đến trình cung cấp cơ sở dữ liệu, nhưng bằng cách bao bọc nó trong một bao đóng biết cách xử lý phản hồi, nó giữ logic đó ra khỏi mô-đun cơ sở dữ liệu của tôi.
Một cải tiến nhỏ là sử dụng một hàm để tạo đóng trình xử lý phản hồi bên ngoài trình xử lý yêu cầu của tôi:
function makeSendResponse(response){
return function sendResponse(err, data) {
if (err) {
console.warn(err);
response.send(500, {error: err});
return;
}
response.send(data);
};
}
Vì vậy, bây giờ trình xử lý yêu cầu của tôi trông giống như sau:
exports.index = function(request, response) {
response.send(makeSendResponse(response));
}
Và MongoProvider của tôi trông như thế này:
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;
Tôi cũng có thể mở rộng MongoProvider cho các bộ sưu tập cụ thể để đơn giản hóa API và xác thực bổ sung:
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;