此问题已从 GitHub 问题移植过来:
在运行时,我想指定在 HTTP 请求经过身份验证(通过策略)后要使用的数据库连接。实现这一目标的最佳方法是什么?
例如,收到 header 为“tenant_id: smith”的 GET 请求以列出所有用户(例如/users)。我现在希望切换到“smith”Mongo DB 来查询并返回该租户的相关数据。
来自 Particlebanana 的回复:
目前尚不支持开箱即用。 “连接”附加到集合并向下发送以向适配器注册自身,在您的例子中是 sails-mongo。
已经有一些讨论,主要围绕 postgresql 适配器,以允许在查询中动态选择模式。这将在查询条件对象上附加一些可由适配器解析的可选参数。但这还不是我们已经开始的事情。一旦 v0.10 最终发布并结束测试版,我们就可以通过这个并提出一个好的解决方案。
目前我能想到的唯一解决方案是一个自定义适配器,它包装 sails-mongo 适配器以动态选择要使用的数据库。
最佳答案
警告:事实证明这是一种潜在危险的方法 - 相反,我们为每个租户创建一组模型:https://github.com/balderdashy/sails-mongo/issues/130
通过这种方法,我取得了一些进展,并且似乎现在可以实现:
我 fork 了 sails-mongo 适配器来创建 sails-mongo-multi 适配器,我将其设置为所有相关模型(即需要 Multi-Tenancy 的模型)的默认值。
在adapter.js内部,在registerConnection函数中,我加载每个租户的所有数据库配置,并为每个租户创建一个新的连接(传入该租户的配置)。这种情况发生在启动时,因此现在我希望在添加新租户时重新启动 Sails。
我创建了一个 switchDB 函数,该函数接受租户 ID,并将迭代每个 Collection 对象并更新其中包含的连接。
我还更新了顶级连接对象(在调用 native 查询时使用)。
如果我发现任何脆弱或损坏的东西,我会在这里发布更新。
关于sails.js - 如何根据请求以编程方式切换数据库来支持 Multi-Tenancy 系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22048082/