loopbackjs:将模型附加到不同的数据源
我定义了几个使用数据源“db”(mysql)的模型用于我的环境。
有没有办法有几个数据源附加到这些模型,所以我将能够执行REST操作到不同的数据库?
即:GET / api / Things?ds =“db”
GET / api / Things?ds =“anotherdb”
GET / api / Things(将使用默认的ds)
正如@superkhau指出的那样,每个LoopBack模型只能连接到一个数据源。
您可以为要使用的每个数据源创build(子类)新模型。 然后,您可以通过唯一的REST URL公开这些每个数据源模型,也可以实现一个包装模型,将方法分派到正确的数据源特定模型。
在我的示例中,我将演示如何为连接到db
和anotherdb
的Car
模型公开每个数据源模型。 Car
模型通常通过common/models/car.json
和common/models/car.js
。
现在您需要定义每个数据源模型:
// common/models/car-db.js { "name": "Car-db", "base": "Car", "http": { "path": "/cars:db" } } // common/models/car-anotherdb.js { "name": "Car-anotherdb", "base": "Car", "http": { "path": "/cars:anotherdb" } } // server/model-config.json { "Car": { "dataSource": "default" }, "Car-db": { "dataSource": "db" }, "Car-anotherdb": { "dataSource": "anotherdb" } }
现在您可以使用以下url:
GET /api/Cars:db GET /api/Cars:anotherdb GET /api/Cars
上面概述的解决scheme有两个限制:您必须为每个数据源定义一个新模型,并且不能使用查询参数select数据源。
要解决这个问题,你需要一个不同的方法。 我会再次假设已经有一个Car
模型已经定义。
现在你需要创build一个“调度员”。
// common/models/car-dispatcher.json { "name": "CarDispatcher", "base": "Model", //< important! "http": { "path": "/cars" } } // common/models/car-dispatcher.js var loopback = require('loopback').PersistedModel; module.exports = function(CarDispatcher) { Car.find = function(ds, filter, cb) { var model = this.findModelForDataSource(ds); model.find(filter, cb); }; // a modified copy of remoting metadata from loopback/lib/persisted-model.js Car.remoteMethod('find', { isStatic: true, description: 'Find all instances of the model matched by filter from the data source', accessType: 'READ', accepts: [ {arg: 'ds', type: 'string', description: 'Name of the datasource to use' }, {arg: 'filter', type: 'object', description: 'Filter defining fields, where, orderBy, offset, and limit'} ], returns: {arg: 'data', type: [typeName], root: true}, http: {verb: 'get', path: '/'} }); // TODO: repeat the above for all methods you want to expose this way Car.findModelForDataSource = function(ds) { var app = this.app; var ds = ds && app.dataSources[ds] || app.dataSources.default; var modelName = this.modelName + '-' + ds; var model = loopback.findModel(modelName); if (!model) { model = loopback.createModel( modelName, {}, { base: this.modelName }); } return model; }; };
最后一点是删除Car
并在模型configuration中使用CarDispatcher
:
// server/model-config.json { "CarDispatcher": { dataSource: null, public: true } }
默认情况下,您只能以每个模型为基础附加数据源。 这意味着您可以通过datasources.json将每个模型附加到不同的数据源。
对于您的用例,您将为每个需要多个数据源的端点添加远程挂钩。 在你的远程钩子,你会做这样的事情:
... var ds1 = Model.app.dataSources.ds1; var ds2 = Model.app.dataSources.ds2; //some logic to pick a data source if (context.req.params... ...
有关更多信息,请参阅http://docs.strongloop.com/display/LB/Remote+hooks 。