Как указывалось выше @superkhaus, каждая модель LoopBack может быть привязана только к одному источнику данных.
Вы можете создать (подкласс) новую модель для каждого источника данных, который вы хотите использовать. Затем вы можете либо предоставить эти модели для каждого источника данных через уникальные URL-адреса REST, либо реализовать модель-оболочку, которая будет отправлять методы в правильную модель, специфичную для источника данных.
В моем примере я покажу, как предоставлять модели для каждого источника данных для модели Car
, которая прикреплена к db
и anotherdb
. Модель 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
Описанное выше решение имеет два ограничения: необходимо определить новую модель для каждого источника данных, и источник данных нельзя выбрать с помощью параметра запроса.
Чтобы это исправить, нужен другой подход. Я снова предполагаю, что уже определена модель Car
.
Теперь нужно создать «диспетчер».
// 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
и использовать CarDispatcher
в конфигурации модели:
// server/model-config.json
{
"CarDispatcher": {
dataSource: null,
public: true
}
}
person
Miroslav Bajtoš
schedule
04.02.2015