【问题标题】:Creating typescript singleton for different Pouchdb instances为不同的 Pouchdb 实例创建打字稿单例
【发布时间】:2018-01-16 08:50:03
【问题描述】:

我有一个与多个数据库交互的节点应用程序。我创建了一个类,然后我开始创建不同的数据库(它们在很大程度上具有相同的 CRUD 模式。

类:

class CRUDService {

  private section: string;
  private pouch: any;

  constructor(section: string) {
    this.section = section;
    this.pouch = new PouchDB('.' + section, pouchOptions);
  }

  public create(data: any): Promise<string> {}

  public retrieve(id: string): Promise<string> {}

  public update(id: any, data: any): Promise<string> {}

  public delete(item: any): Promise<string> {}

  public all(): Promise<string> {}

export {CRUDService};

数据库启动:

function Users() {
  return new CRUDService('users');
}

export {Users};

然后我像这样在整个应用程序中使用它:

import {Users} from 'databases';
const userService = Users();

userService.something()

我注意到在这个设置中,用户数据库被初始化了多次。我认为我需要解决这个问题是一个单例。我了解我的单身人士是什么,但在这种情况下无法使用单身人士。

任何帮助或指导将不胜感激。

【问题讨论】:

  • 您可能希望保留Users 的某种形式的静态实例并检查该实例是否为空。如果是,则将该实例设置为新的CRUDService('user'),如果不是,则返回该实例.

标签: node.js typescript pouchdb


【解决方案1】:

看起来你不一定需要一个单例,你可以简单地将数据库实例存储在 CRUD Service 的静态字段中,使用映射(也可以只是一个对象):

class CRUDService {

    private static pouchDb: Map<string, PouchDB> = new Map<string, PouchDB>();

    private section: string;
    private pouch: any;

    constructor(section: string) {
        this.section = section;

        if (!CRUDService.pouchDb.has(this.section)) {
            CRUDService.pouchDb.set(section, new PouchDB('.' + section, pouchOptions));
        }

        this.pouch = CRUDService.pouchDb.get(this.section);
    }

    public create(data: any): Promise<string> {}

    public retrieve(id: string): Promise<string> {}

    public update(id: any, data: any): Promise<string> {}

    public delete(item: any): Promise<string> {}

    public all(): Promise<string> {}
}

当然,您可以将此数据库实例管理分解为另一个类。

【讨论】:

  • 感谢您查看...第二行产生一些错误“错误:(7, 39) TS2709: Cannot use namespace 'PouchDB' as a type.”
  • 你是如何导入PouchDB的?你也可以使用类型any 而不是PouchDB,它只是没有类型安全性(或者如果你使用它的话,编辑器会自动完成很好)。
  • import * as PouchDB from 'pouchdb'; 如果我尝试 import * as PouchDB from 'pouchdb' 它会丢失这些类型错误,但会导致自 PouchDB 以来的其他问题。尝试使用 any 代替 PouchDB,尽管它消除了所有类型错误,但应用程序并未按预期运行。可以在 Users() 级别完成某些事情,还是真的需要在父类中解决?
  • 对不起,在上面的第二个代码 sn-p 中是 import {PouchDB} from 'pouchdb'
  • PouchDB 和 TypeScript 似乎一直存在问题:github.com/pouchdb/pouchdb/issues/6672。关于这个问题的最后一条评论似乎提供了一个可能的解决方案
猜你喜欢
  • 1970-01-01
  • 2022-11-09
  • 2017-07-02
  • 2018-02-08
  • 2012-11-07
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多