2014-11-25 12 views
6

Mam zdefiniowane kilka modeli, które używają źródła danych "db" (mysql) dla mojego środowiska.loopbackjs: Dołącz model do różnych źródeł danych

Czy istnieje jakiś sposób, aby mieć kilka źródeł danych dołączonych do tych modeli, więc byłbym w stanie wykonać operacje REST do różnych baz danych?

czyli:? GET/api/miejsca DS = "db"/api/miejsca DS

GET = "anotherdb"

GET/api/Things (użyje domyślnych DS)

Odpowiedz

6

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 
    } 
} 
1

Domyślnie można dołączać źródła danych tylko dla poszczególnych modeli. Oznacza to, że możesz dołączyć każdy model do innego źródła danych za pośrednictwem datasources.json.

W przypadku użycia dodaj haczyk do każdego punktu końcowego, który chcesz dla wielu źródeł danych. W zdalnej hak, zrobisz coś takiego:

... 
var ds1 = Model.app.dataSources.ds1; 
var ds2 = Model.app.dataSources.ds2; 

//some logic to pick a data source 
if (context.req.params... 
... 

Zobacz http://docs.strongloop.com/display/LB/Remote+hooks aby uzyskać więcej informacji.