Node.js& Typescript Singleton模式:看起来单身用户之间不共享singleton

时间:2017-12-03 10:36:56

标签: node.js typescript singleton

我在后端Node.js应用程序中使用Typescript(2.5.3),并试图找出我的编码错误在哪里,在下面的代码中。简而言之,我有一个主类,以及其他几个使用这个主类的类:

数据库(主要类):

  • 这是一个单身人士(见下面export let DB = DataBase.Instance;
  • 其作用只是连接到Mongo数据库,如果连接成功与否则设置标志。其他类将使用此标志来确定是否已建立连接。

ModelParametersDataBase(其他类之一):

  • 此类导入主类(请参阅下面的import { DB } from './DataBase' ;
  • 通过主类获取连接状态。

以下是我的问题:  我的问题是,即使连接一劳永逸地建立(DB.dataBaseStatus = true),ModelParametersDataBase在调用单例的getter时得到false。< / p>

以下是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));
      }
    });
  }

}

你能指出我的错误在哪里吗?感谢。

1 个答案:

答案 0 :(得分:0)

您正尝试使用静态上下文中的this关键字实例化类。 为什么不做更像这样的事情:

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

export default DataBase;

然后像这样使用它:

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

甚至可以从文件中导出单个实例:

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

编辑: 此外,在设置this等实例变量时,您应该使用databaseStatus关键字。