Jak wspomniano powyżej @superkhau, każdy model LoopBack może być dołączony tylko do jednego źródła danych.
Możesz utworzyć (podklasę) nowy model dla każdego źródła danych, którego chcesz użyć. Następnie możesz ujawnić te modele danych źródłowych za pomocą unikalnych adresów URL REST lub możesz zaimplementować model opakowania, który wyśle metody do właściwego modelu specyficznego dla źródła danych.
W moim przykładzie pokażę jak wystawiać modele per-źródłem danych dla Car
modelu, który jest dołączony do db
i anotherdb
. Model Car
jest zdefiniowany w zwykły sposób za pośrednictwem common/models/car.json
i common/models/car.js
.
Teraz trzeba zdefiniować modele per-źródło danych:
// 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"
}
}
Teraz masz następujące adresy dostępne:
GET /api/Cars:db
GET /api/Cars:anotherdb
GET /api/Cars
Rozwiązanie przedstawione powyżej ma dwa ograniczenia: trzeba zdefiniować nowy model dla każdego źródła danych i źródła danych nie można wybrać za pomocą parametru zapytania.
Aby to naprawić, trzeba zastosować inne podejście. Ponownie przyjmuję, że istnieje już zdefiniowany model Car
.
Teraz musisz utworzyć "dyspozytora".
// 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;
};
};
Ostateczna bit jest usunięcie Car
i używać CarDispatcher
w modelu config:
// server/model-config.json
{
"CarDispatcher": {
dataSource: null,
public: true
}
}