最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

loopbackjs:将一个模型,不同的数据源

IT培训 admin 3浏览 0评论

loopbackjs:将一个模型,不同的数据源

我已经定义了使用数据源“DB”(MySQL的)我的环境几款机型。

有什么办法有连接到那些模型多个数据源,所以我将能够执行REST操作到不同的数据库?

即:GET / API / DS的事情= “DB”?

GET / API /事呢?DS = “anotherdb”

GET / API /事(将使用默认DS)

回答如下:

正如@superkhau上面所指出的,每个环回模式可以连接到仅单个数据源。

您可以创建(子类)为您要使用的每个数据源的新模式。然后,您可以通过独特的REST的URL揭露这些每个数据源的模型,也可以实现一个包装模式,将派遣方式到正确的数据源特定的模型。

在我的例子中,我将介绍如何暴露每个数据源模型是连接到Cardb一个anotherdb模型。该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"
  }
}

现在,您有以下网址提供:

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

loopbackjs:将一个模型,不同的数据源

我已经定义了使用数据源“DB”(MySQL的)我的环境几款机型。

有什么办法有连接到那些模型多个数据源,所以我将能够执行REST操作到不同的数据库?

即:GET / API / DS的事情= “DB”?

GET / API /事呢?DS = “anotherdb”

GET / API /事(将使用默认DS)

回答如下:

正如@superkhau上面所指出的,每个环回模式可以连接到仅单个数据源。

您可以创建(子类)为您要使用的每个数据源的新模式。然后,您可以通过独特的REST的URL揭露这些每个数据源的模型,也可以实现一个包装模式,将派遣方式到正确的数据源特定的模型。

在我的例子中,我将介绍如何暴露每个数据源模型是连接到Cardb一个anotherdb模型。该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"
  }
}

现在,您有以下网址提供:

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
  }
}
发布评论

评论列表 (0)

  1. 暂无评论