6

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

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

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

(我正在为数据源使用 mysql 连接器)

以下是我的中间件代码

'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();
  };
};

实现此目的的其他方法也可能有所帮助。

4

1 回答 1

0

app.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);
        }
      });
}
...
于 2017-01-30T14:13:40.533 回答