sails.js - 如何根据请求以编程方式切换数据库来支持 Multi-Tenancy 系统?

标签 sails.js

此问题已从 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/

相关文章:

javascript - 访问 JSON 数组时出现问题

sails.js - 如何控制 sails.js 从模型生命周期方法中发送的错误代码?

node.js - 使用 Forever 运行的 NodeJS 应用程序在浏览器中出现 502 错误

node.js - Sails Js 权限

node.js - 如何格式化 sails.js 模型的日期时间

javascript - 在javascript中追加对象

node.js - 使用 sails.js 修改响应 header 以实现 HSTS

node.js - Sails js,我们如何使用 populate 编写内连接

Sails.js、Ember、Handlebars 和通过 grunt-ember-templates 进行的配置 : templates file not created

node.js - 如何在 sails.js 和水线中执行嵌套连接?