loopbackjs:将模型附加到不同的数据源

我定义了几个使用数据源“db”(mysql)的模型用于我的环境。

有没有办法有几个数据源附加到这些模型,所以我将能够执行REST操作到不同的数据库?

即:GET / api / Things?ds =“db”

GET / api / Things?ds =“anotherdb”

GET / api / Things(将使用默认的ds)

正如@superkhau指出的那样,每个LoopBack模型只能连接到一个数据源。

您可以为要使用的每个数据源创build(子类)新模型。 然后,您可以通过唯一的REST URL公开这些每个数据源模型,也可以实现一个包装模型,将方法分派到正确的数据源特定模型。

在我的示例中,我将演示如何为连接到dbanotherdbCar模型公开每个数据源模型。 Car模型通常通过common/models/car.jsoncommon/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