node.js - loopbackjs:将模型附加到不同的数据源

标签 node.js loopbackjs strongloop

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

有没有什么方法可以将多个数据源附加到这些模型,这样我就可以对不同的数据库执行 REST 操作?

即: 获取/api/Things?ds="db"

GET/api/Things?ds="anotherdb"

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

最佳答案

正如@superkhau 上面指出的,每个 LoopBack 模型只能附加到一个数据源。

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

在我的示例中,我将展示如何为附加到 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

上述解决方案有两个局限性:您必须为每个数据源定义一个新模型,并且不能使用查询参数选择数据源。

要解决这个问题,您需要一种不同的方法。我将再次假设已经定义了一个 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
  }
}

关于node.js - loopbackjs:将模型附加到不同的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27124525/

相关文章:

javascript - 在 Nodejs 中处理异步

javascript - 如何使用node获取给定url的所有元素的css?

java - 从 Java 客户端向 LoopBack 发送数据时 HTTP/1.1 422 Unprocessable Entity 错误

mysql - 带有使用列值的表达式的 loopbackjs where 子句

access-token - 允许环回应用程序使用以前的访问 token

node.js - AWS DynamoDB-Data-Mapper NodeJS

node.js - ENOTFound 使用 Bower 安装 Gulp-Sass 时出错

node.js - 环回错误 : connect ECONNREFUSED 127. 0.0.1:3306 (MAMP)

node.js - 如何在node.js中安装Strongloop api并可以使用loopback

node.js - 环回事件流跟踪服务器端模型中的更改