【问题标题】:Meteor change database at run time运行时流星更改数据库
【发布时间】:2018-05-18 19:36:01
【问题描述】:

我有三个数据库,即 ma​​in_db 它是默认加载数据库。我想在登录后加载数据库。 数据库是:-

ma​​in_db

->user_collection

psm_2017_db

->abc_collection

->xyz_collection

psm_2018_db

->abc_collection

->xyz_collection

这是我的项目结构

这是我的登录脚本。

client
 |->login
  |->login.js

            Template.login.rendered = function(){
            SessionStore.set("login_user",false);
            };
            Template.login.events({
                'submit #formLogin': function (event, target){
                    event.preventDefault();
                    var email = target.find('#loginEmail').value;
                    var password = target.find('#loginPassword').value;
                    // console.log(email +" "+password);
                    Meteor.loginWithPassword(email, password, function(err){

                        if(err){
                        console.log(err);
                            alert("Invalid Login!");
                        }
                        else {
                        SessionStore.set("login_user",true);
                            console.log('successfully')
                            Router.go("/dashboard")
                        }
                    });
                }
            });

            Template.layout.helpers({
            "isLoggedin": function () {
                return SessionStore.get("login_user");
            }
            });

这是我的负载收集文件

lib
 |->collection.js

     abcCollection=new Mongo.Collection("abc_collection");         
     xyzCollection=new Mongo.Collection("xyz_collection");

【问题讨论】:

标签: javascript node.js meteor


【解决方案1】:

您可以使用以下方法连接到多个数据库。

var database = new MongoInternals.RemoteCollectionDriver("<<mongo url>>");
MyCollection = new Mongo.Collection("collection_name", { _driver: database });

&lt;&lt;mongo_url&gt;&gt; 是您的标准 mongodb 网址。 例如。 mongodb://127.0.0.1:27017/database_name

现在,在您的特定场景中,main_db 包含用户集合(我假设这与流星用户集合有关)。您需要始终加载此文件。您无法在登录后加载它,因为用户信息 - 登录所需的信息位于该数据库中!

完成上述操作后,可以在登录时连接到剩余的两个数据库,如下所示:

/lib/dbconnection.js(这对服务器和客户端都是通用的)

Meteor.methods({
    loadDB: function(){

        if(Meteor.userId()){ // if a user has logged in

            var database = new MongoInternals.RemoteCollectionDriver("<<mongo url>>");
            MyCollection = new Mongo.Collection("collection_name", { _driver: database });

        }


    }
})
Meteor.call("loadDB");

loadDB 将在每次用户登录时被调用。但我担心每次任何用户登录时都会运行它。为了避免为每个用户重新初始化它登录后,您可能需要检查databasemyCollection 是否已存在。

【讨论】:

  • 我想动态加载数据库。例如mongodb://127.0.0.1:27017/&lt;dbNameVar&gt;
  • 我想您可以将它包装在一个函数中并在用户登录时调用它?这必须与客户端和服务器共同存在。
  • 是的,但是如何做到这一点。因为流星在启动阶段加载了lib目录。
  • 更新了我的答案来解决这个问题。
  • 当我刷新网页时,此错误"Exception while invoking method 'loadDB' Error: There is already a collection named ...." 在服务器端生成。如何处理这个
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 2014-10-25
  • 2013-10-13
  • 2013-12-24
  • 2020-08-19
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
相关资源
最近更新 更多