0

各ユーザーが独自のサブドメインと、サブドメインごとに異なる mongo データベースを持つアプリケーションがあります。リファラーサブドメインに基づいて特定のデータベースに接続しようとしています。まず、リクエストの送信元のサブドメインを確認してから、動的なmongo接続文字列を作成しています。

let Url = 'mongodb://DB_USER:DB_PASS@DB_HOST:DB_PORT/DYNAMIC_DB_NAME';
DataAccess.setConnectionString(req, Url, domain);

その後、接続インスタンスをグローバル変数に保存し、この情報を保存するためにグローバル配列を宣言しました。server.js で:

global.mongoInstances = []; 

以下は、最初にチェックするコードです。接続が既に確立されている場合は、グローバル配列からマングース接続インスタンスを提供しますが、リクエストがそのサブドメインから初めて来た場合は、新しい接続を作成し、インスタンスをグローバル配列にプッシュします。

    static setConnectionString(req, url, domain){
        this.mongooseInstance = '';
        let self = this;
        if(domain && domain !== '') {
            var inArray = false;
            for (var k in global.mongoIntances) {
                if (global.mongoIntances.hasOwnProperty(k)) {
                   if( global.mongoIntances[k].domain === domain) {
                    console.log('domain is aready in the array ', global.mongoIntances[k].domain, ' === request domain ', domain);
                    self.mongooseInstance = '';
                    console.log('from session to global.instance db name', global.mongoIntances[k].connections[0].name);
                    self.mongooseInstance = global.mongoIntances[k].instance;
                    inArray = true;
                    console.log('typeof ', global.mongoIntances[k]);
                    console.log('after swithching the db, new db name is ',  self.mongooseInstance.connections[0].name);
                    return self.mongooseInstance;
                   }
                }
            }
            if(!inArray) {
                Mongoose.connection.close(function () {
                    if (global.mongoIntances.length > 0) {
                        console.log('before push db name is', util.inspect(global.mongoIntances[0].instance.connections[0].name, {depth: 3}));
                    }
                    self.mongooseInstance = Mongoose.connect(url);
                    console.log('connection url is ', url, ' and connected db is ', self.mongooseInstance.connections[0].name);
                    global.mongoIntances.push({domain: domain, instance: self.mongooseInstance});
                    if (global.mongoIntances.length > 0) {
                        console.log('after push db name is from array ', util.inspect(global.mongoIntances[0].instance.connections[0].name, {depth: 3}) , ' db name after push from self.mongooseInstance ', self.mongooseInstance.connections[0].name);
                    }
                    for (var k in global.mongoIntances) {
                        if (global.mongoIntances.hasOwnProperty(k)) {
                            console.log('loop global array ',  global.mongoIntances[k].instance.connections[0].name , ' domian name ', global.mongoIntances[k].domain);
                        }
                    }
                    return self.mongooseInstance;
               });   
            }
        }
    }

しかし、問題は、要求がサブドメインから来るたびに、グローバル配列に既に追加されているインスタンスを最新の接続インスタンスに置き換えていることです。リクエストが demo1 サブドメインから来た場合のように、配列の値は次のようになります。

  {domain: demo1, instance: demo1}

リクエストが demo2 サブドメインからのものである場合、配列の値は次のようになります。

  {domain: demo1, instance: demo2}
  {domain: demo2, instance: demo2}

すべての接続インスタンスを最新の接続インスタンスに置き換えるたびに、ここ数日で多くのことを試しましたが、ここで何が問題なのかわかりません。答えを知っている人がいたら教えてください。

4

0 に答える 0