我正在尝试创建loopback4,mysql-connector,多租户应用程序,但是我需要知道如何在运行端点调用之前将正确的数据库分配给TenantDataSource。
应用程序的一些信息:
每个租户数据库架构都包含“测试”模型。
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
});