2017-12-03 7 views
0

私はバックエンドNode.jsアプリケーションでTypescript(2.5.3)を使用しています。次のコード。簡単に言うと、私は1つのメインクラスを持っており、このメインクラスを使用する他のいくつかのクラス:Node.js&Typescriptシングルトンパターン:シングルトンがシングルトンユーザー間で共有されていないようです

データベース(メインクラス):

  • 役割シングルトン(下記export let DB = DataBase.Instance;を参照)
  • です単にMongoデータベースに接続し、接続が成功したかどうかを示すフラグを設定するだけです。このフラグは、他のクラスが接続が確立されたかどうかを知るために使用されます。

ModelParametersDataBase(他のクラスの1つ):

  • このクラスはメインクラス(以下import { DB } from './DataBase' ;参照)
  • メインクラスを介して接続状態を取得しインポート。

は、ここに私の問題です: 私の問題は、接続は(DB.dataBaseStatus = trueが呼ばれた)が一度確立し、すべてのためであっても、シングルトンのゲッターを呼び出すとき、ModelParametersDataBaseはfalseを取得していることです。ここで

DataBase.tsからの抜粋です:

class DataBase { 

    private static _instance: DataBase = undefined; 

    private dataBaseStatus_ = false ; 


    public static get Instance() { 
    return this._instance || (this._instance = new this()); 
    } 
    public get dataBaseStatus() { 
    return this.dataBaseStatus_ ; 
    } 

    public set dataBaseStatus(status :boolean) { 
    this.dataBaseStatus_ = status ; 
    } 

    public configDatabase() { 

    /* Connect to Mongo DB */ 
    mongoose.connect(MONGODB_CONNECTION_ROOT + MONGODB_DB_NAME, options) 
     .then(() => { 
     DB.dataBaseStatus = true ; 

     debug('CONNECTED TO DATABASE '); 
     }, 
     err => { 
     DB.dataBaseStatus = false ; 
     debug('ERROR - CANNOT CONNECT TO DATABASE'); 
     } 
    ); 
    } 
} 

/** Instantiate singleton */ 
export let DB = DataBase.Instance; 

ここ姉は私がModelParametersDataBaseクラスでこのシングルトンを使用する方法である:私のミスがどこにある

import { DB } from './DataBase' ; 

export class ModelParametersDataBase { 

    public static getModelParameters(): Promise<IModelParameters> { 
    return new Promise((resolve, reject) => { 

     if (DB.dataBaseStatus) { 
     // do stuff 
     } else { 
     reject(Error(CANNOT_REACH_DB)); 
     } 
    }); 
    } 

} 

あなたが指摘していただけますか?ありがとう。

答えて

0

staticコンテキストからthisキーワードでクラスをインスタンス化しようとしています。 なぜ、もっとこのような何かを行うにはない:

class DataBase {}; 
export default new DataBase(); 

EDIT:あなたは、ファイルからの単一のインスタンスをエクスポートすることができ

import DataBase from './DataBase'; 
Database.getInstance(); 

あるいは:

class DataBase { 
    private static instance = new DataBase(); 
    public static getInstance =() => DataBase.instance; 
} 

export default DataBase; 

をし、このようにそれを使用します。 さらに、databaseStatusのようにインスタンス変数を設定する場合は、thisというキーワードを使用する必要があります。

+0

この回答ありがとうございます。しかし、問題は変わりません。私のdatabaseStatus_変数siは正しくtrueに設定されていますが、データベースインスタンス経由で値を取得するときはfalseです。 より正確に言うと、クラスのデフォルトで定義されている値にとどまっています。デフォルト値がtrueに設定されている場合、データベースインスタンスを介してtrueになります。 – LudoZik

+0

静的でないため、this.databaseStatusを設定する必要があります。 –

関連する問題