强制Node.js模块遵循接口

时间:2016-03-18 03:43:11

标签: javascript node.js interface adapter node-modules

我有一个简单的通用数据库接口,并希望强制我的数据库适配器遵循该接口。因此,db.jsfake_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);
}

0 个答案:

没有答案