sails.js - 我想在升帆后动态添加数据库连接

sails.js - I want to add DB connection dynamically after sails lift

在扬帆期间,我还没有我的数据库的所有连接信息。

有没有办法让配置值依赖于 promises 或在升帆完成后动态创建连接?

如果模型尚不可用,我显然必须添加策略或挂钩来处理对需要该模型的路线的请求,但此时我什至不知道如何让风帆升起,直到我已经知道连接信息(它必须在配置中)。

我希望我错过了一种动态创建连接和连接模型的方法。

是; sails.js 中的两件事可以让你做到这一点。一个当前存在,一个即将推出。

  1. https://github.com/sgress454/sails-hook-autoreload。此模块监视磁盘上的配置文件更改,并在文件更改时重新加载您的 ORM 模型。

  2. 我现在正在研究这个确切的功能,我的计划是在下周末发布我的作品。我同意它会很有用。

API 将允许您在数据库 中动态定义新模型和连接。 sails.js 生命周期回调处理更新 ORM 和适配器等。它是基于事件的,允许您手动触发事件来更新 ORM/Connections,如下所示:

  • sails.emit('hook:dynamic-orm:reload')

这是您需要的吗?

Update: In Sails v1.0 / Waterline v0.13, this can be accomplished by accessing the stateless, underlying driver; e.g. sails.getDatastore().driver. This can be used in any database adapter that supports the new stateless driver interface, including MySQL, PostgreSQL, and MongoDB.


在 Sails v1.0 之前,这在 Sails 或 Waterline 中未得到官方直接支持,但根据您的用例,有几个很好的解决方案。如果您的用例是出于开发目的的少量动态连接(例如在 auto-reload 插件中),并且您愿意生活在边缘,您可以利用私有 API作为 immediate-term 解决方法:sails.hook.orm.reload()。但是,您 绝对 不想在生产中使用它,因为它确实会刷新整个 ORM。

如果您 将在 [=41] 的生命周期内处理 runtime-dynamic 数据存储配置的更大数量(比方说 > 10 个唯一配置) =] 节点进程,那是另一回事。在那种情况下,我建议使用相关的原始驱动程序(例如 https://github.com/felixge/node-mysql) to summon/release those dynamic connections from a pool directly via a service。您仍然可以在应用程序中使用普通模型进行静态连接——您最好实现 dynamic 数据库连接在您的服务中分开。例如,如果您正在构建 phpMyAdmin 的托管版本,您可能会使用 lower-level NPM 包来动态获取有关用户表的信息,但您仍然可能想要将引用 tables/collections 的 AccountDatabase 模型存储在您自己的数据库中。

一个更加集成的 Sails 解决方案正在开发中。这种利用原始连接生命周期并从用户空间访问它的能力是 built-in 事务支持的先决条件,我们希望在 2016 年下半年的某个时间 Sails/Waterline 实现这一点。在与此同时,如果你按照上面的建议通过服务方法将你的逻辑封装到 summon/release 连接,你现在将有一个可行的解决方案,你的业务逻辑应该或多或少地面向未来(当你升级时,你会只需要换掉服务中的实现)。希望对您有所帮助!

我找到了 MySql DB

的解决方法

重要提示:在我的例子中,我将更改数据库,但所有数据库都将具有相同的架构,唯一的区别在于它们的名称和它们包含的数据,并确保添加您需要的任何错误处理

在config/connection.js -------- 禁用池化

 mysql_database: {
   adapter: 'sails-mysql',
   host: 'localhost',
   user: 'root', //optional
   password: '12345', //optional
   database: 'db1', //optional
   pool: false
 },

现在导航至

node_modules/sails-mysql/lib/connections/spawn.js

添加connectionObject.config = sails.SwitchDbConfig

connectionObject.config = sails.SwitchDbConfig

var conn = mysql.createConnection(connectionObject.config);
  conn.connect(function (err) {
    afterwards(err, conn);
  });

现在终于在任何地方设置 sails.SwitchDbConfig 表单(服务、控制器等) 作为

sails.SwitchDbConfig = { 
            pool: false,
            connectionLimit: 5,
            waitForConnections: true,
            adapter: 'sails-mysql',
            host: 'localhost',
            user: 'root',
            password: '12345',
            database: sails.DB_NAME,
            identity: 'mysql_database' 
          }

最后,如果您发现需要更新的问题....请 ping