【问题标题】:Loopbackjs: Switch DB in datasource based on request originLoopbackjs:根据请求来源在数据源中切换数据库
【发布时间】:2017-06-12 19:05:40
【问题描述】:

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

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

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

(我正在为数据源使用 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();
  };
};

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

【问题讨论】:

  • 也许使用 app.datasources 而不是创建新数据源可以解决问题
  • 但是如果我直接使用app.datasoures,如何更改数据库名称

标签: javascript backend loopbackjs angular-loopback


【解决方案1】:

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);
        }
      });
}
...

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多