Node.js sails.js-我想在帆提升后动态添加DB连接

Node.js sails.js-我想在帆提升后动态添加DB连接,node.js,sails.js,waterline,Node.js,Sails.js,Waterline,在扬帆过程中,我还没有数据库的所有连接信息 有没有一种方法可以让配置值依赖于承诺,或者在sails lift完成后动态创建连接 如果模型不可用,我显然必须添加一个策略或钩子来处理对需要该模型的路由的请求,但在这一点上,我甚至不知道如何让帆升起,直到我已经知道连接信息(它必须在配置中) 我希望我错过了一种动态创建连接并将模型连接到它们的方法。是;在sails.js中有两件事允许您这样做。一个目前存在,一个即将到来 。此模块监视磁盘上的配置文件更改,并在文件更改时重新加载您的ORM模型 我现在正致力

在扬帆过程中,我还没有数据库的所有连接信息

有没有一种方法可以让配置值依赖于承诺,或者在sails lift完成后动态创建连接

如果模型不可用,我显然必须添加一个策略或钩子来处理对需要该模型的路由的请求,但在这一点上,我甚至不知道如何让帆升起,直到我已经知道连接信息(它必须在配置中)


我希望我错过了一种动态创建连接并将模型连接到它们的方法。

是;在sails.js中有两件事允许您这样做。一个目前存在,一个即将到来

  • 。此模块监视磁盘上的配置文件更改,并在文件更改时重新加载您的ORM模型

  • 我现在正致力于这一专题,我的计划是在下周末出版我的作品。我同意这将非常有用

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

    • sails.emit('hook:dynamic orm:reload')
    这是你需要的吗

    更新:在Sails v1.0/Waterline v0.13中,这可以通过访问无状态的底层驱动程序来实现;例如。这可以在任何支持新的无状态驱动程序接口的数据库适配器中使用,包括MySQL、PostgreSQL和MongoDB


    在Sails v1.0之前,Sails或Waterline没有直接正式支持这一点,但根据您的使用情况,有两个很好的解决方案。如果您的用例是为开发目的的少量动态连接(例如,在自动重新加载插件中),并且您愿意生活在边缘,那么您可以利用私有API作为一种即时解决方法:。但是,您肯定不想在生产中使用它,因为它实际上会刷新整个ORM

    如果要在运行节点进程的生命周期内处理更多的运行时动态数据存储配置(比如说,超过10个唯一配置),则情况就不同了。在这种情况下,我建议使用相关的原始驱动程序(例如)直接通过调用池调用/释放池中的动态连接。您仍然可以在应用程序中使用普通模型进行静态连接——最好在服务中单独实现动态数据库连接。例如,如果您正在构建一个托管版本的phpMyAdmin,您可能会使用一个较低级别的NPM包来动态获取有关用户表的信息,但您可能仍然希望拥有引用存储在您自己的数据库中的表/集合的
    帐户
    数据库
    模型


    一个更为集成的Sails解决方案正在开发中。这种利用原始连接生命周期并从userland访问它的能力是内置事务支持的先决条件,我们希望在2016年下半年的某个时候在Sails/Waterline中实现这一点。同时,如果您像上面建议的那样封装逻辑,通过服务方法调用/释放连接,那么您现在就有了一个可用的解决方案,并且您的业务逻辑应该或多或少是经得起未来考验的(当您升级时,您只需交换服务中的实现)。希望有帮助

    我找到了MySql数据库的解决方案

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

    在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表单 作为


    最后,如果你发现问题,需要更新。。。。请ping

    如果我理解正确,那么我认为选项2可能正是我想要的。在我的例子中,我试图避免将密码存储在磁盘上,所以我不确定选项1(自动登录)是否足够。也就是说,我将看看它是如何实现的,看看我是否能够使用类似的技术。通过您为选项2所做的工作,我是否能够在lift提供大多数配置数据,但稍后再添加密码?(没有存储在磁盘上)我不知道你说的“以后添加密码”是什么意思。但总的来说是的;您可以在配置文件中混合/匹配定义连接,也可以将它们存储在数据库中。很快就会准备好的。我很期待。请在完成后回复此问题(即使它有问题:)。我很想得到它。不幸的是,我和我的团队不再维护Sails.js。顺便说一下,如果您正在处理中间的某个场景(例如,使用动态配置动态生成的一次性(白标签)部署),那么您还可以实现一个解决方案,在Sails中抢占配置加载程序@4lpine在这里为这个解决方案编写了一个很好的演练:下面是一个在Sails v1中实现这一点的方法示例:是否为Sails中的这个特定用例添加了任何功能?您可以提供dicument链接吗?但您正在对节点\ U模块进行更改。您计划如何在一个团队或多个环境中分发这些更改?
    sails.SwitchDbConfig = { 
                pool: false,
                connectionLimit: 5,
                waitForConnections: true,
                adapter: 'sails-mysql',
                host: 'localhost',
                user: 'root',
                password: '12345',
                database: sails.DB_NAME,
                identity: 'mysql_database' 
              }