如何在多租户Loopback4 + MySQL应用程序上分配正确的租户数据库

时间:2019-11-14 18:42:17

标签: loopback4

我正在尝试创建loopback4,mysql-connector,多租户应用程序,但是我需要知道如何在运行端点调用之前将正确的数据库分配给TenantDataSource。

应用程序的一些信息:

  • MainDatasource包含控制应用程序的用户模型和其他模型。 (使用主数据库模式)
  • Mysql还包含tenant_1,tenant_2,tenant_xxxx,每个租户一个
  • TenantDatasource负责此数据库连接。
  • jwt令牌为连接提供了user和user.defaultTenant
  • 每个租户数据库架构都包含“测试”模型。

  • 根据传递的user.defaultTenant,
  • TenantDatasource必须为每个端点连接连接到正确的数据库。

我试图在下面创建拦截器,但是失败了,为下一次调用而不是当前的调用更改了数据库。 `

const defineSchema: Interceptor = async (invocationCtx, next) => {
  console.log('log: before-', invocationCtx.methodName);
  const test: Test = new Test();
  if (invocationCtx.methodName == 'create')
    Object.assign(test, invocationCtx.args[0]);
  else if (invocationCtx.methodName == 'updateById')
    Object.assign(test, invocationCtx.args[1]);

  console.log('********************************** use schema change *************************************');
  // @ts-ignore
  invocationCtx.target.testRepository.execute('use tenant_?', [invocationCtx.target.user.defaultTenant]);
  const result = await next();
  return result;
};

有什么想法吗?

PS: 此行为是关于为执行的每个命令获取和使用不同的mysql会话(第一个用于“ use tenant_xx”,第二个用于next())。如果我在DataSource连接字符串上将connectionLimit设置为1,则截取有效,但我认为这不是最佳解决方案。

  Object.assign(dsConfig, {
      host: process.env.DB_HOST,
      port: process.env.DB_PORT,
      user: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_TENANT_DATABASE,
      connectionLimit: 1
    });

0 个答案:

没有答案