Loopbackjs:根据请求来源在数据源中切换DB

时间:2017-01-27 06:39:00

标签: javascript backend loopbackjs angular-loopback

我需要根据请求来源在loopback数据源中切换数据库

例如。如果我从 xyz.domain.com 发出请求,我需要为数据源选择 xyz 数据库(我们在前端使用通配符子域,因此会有多个这样的子域名。)

我尝试构建中间件,从每个请求源中提取子域,并为数据源设置数据库。现在的问题是在几个同时发出的请求之后,环回服务器因“连接太多”而中断(可能是因为它在每个请求上都创建了新的连接线程)

(我使用my-sql连接器作为数据源)

以下是我的中间件代码

'use strict';

const DataSource = require('loopback-datasource-juggler').DataSource;
const app = require('../../server/server.js');
const getSubdomain = require('../middlewares/getSubdomain.js');

module.exports = function() {
  return function datasourceSelector(req, res, next) {
    if (req.path !== '/api/check-realm') {
      let subdomain = getSubdomain(req); // this will get me subdomain from request origin

      let dataSource = new DataSource({
        'host': 'localhost',
        'port': 3306,
        'database': subdomain ? subdomain[1] || 'default' : 'default',
        'user': 'user',
        'password': 'user',
        'name': 'mysqlDS',
        'connector': 'mysql'
      }); // This creates new datasource on every request with appropriate database

      let models = app.models();

      models.forEach(function(model) {
        if (model.modelName !== 'Email') {
          model.attachTo(dataSource);
        }
      }); // here I am attaching all models to the newly created datasource.

      app.dataSource("mysqlDS", dataSource);

    }
    next();
  };
};

实现这一目标的其他方法也很有用。

1 个答案:

答案 0 :(得分:0)

app.datasources包含您在应用程序中定义的所有数据源。

例如:

// datasources.json

{
  "memo": {
    "name": "memo",
    "connector": "memory"
  },
  "admin": {
    "host": "localhost",
    "port": 27017,
    "url": "",
    "database": "test_db",
    "password": "",
    "name": "admin",
    "user": "",
    "connector": "mongodb"
  }

然后在您的代码中检查子域名并且:

...
if (subdomain === 'admin'){
   models.forEach(function(model) {
        if (model.modelName !== 'Email') {
          model.attachTo(app.datasources.admin);
        }
      });
}
...