我有一个简单的通用数据库接口,并希望强制我的数据库适配器遵循该接口。因此,db.js
和fake_mongo_adapter.js
应该具有相同的功能'名字和参数,像这样:
db.init(client, options, callback)
db.get(client, query, callback)
现在我正在使用Underscore的extend
函数,并在没有必要的函数时抛出异常。
可以吗?
是否还有其他方法可以强制几个Node.js模块遵循一个合同?
server.js,入口点
var _ = require('underscore');
var mongoose = require('mongoose'); // Adaptee
var db = require('./db');
var fake_mongodb_adapter_raw = require('./fake_mongodb_adapter');
var fake_mongodb_adapter = _.extend({}, db);
fake_mongodb_adapter = _.extend(fake_mongodb_adapter, fake_mongodb_adapter_raw);
mongoose.connect('connection string');
fake_mongodb_adapter.init(mongoose, options, function run_app(err, person_model) {
fake_mongodb_adapter.get(person_model, { _id: '1234' }, function (err, found_person) {
console.log('found person: ' + JSON.stringify(found_person));
});
});
db.js,客户端使用的通用数据库接口,不应该更改。
module.exports = {
init: init,
get: get
};
function init(client, options, callback) {
throw new Error('Function "init" not implemented');
}
function get(client, query, callback) {
throw new Error('Function "get" not implemented');
}
fake_mongodb_adapter.js
module.exports = {
init: init,
get: get
};
function init(client, options, callback) {
console.log('initialized fake MongoDB adapter');
return callback(null);
}
function get(client, query, callback) {
var person = { id: '1234', name: 'Mary' };
return callback(null, person);
}