Angular 服务中不提供关系 pouch 方法

Relational pouch methods aren't available in Angular Service

我正在尝试让 relational-pouch 正常工作,我能够设置模式,但是当我调用保存函数时我收到错误 TypeError: this.rel.save is not a function

这是设置:

import PouchDB from 'pouchdb-browser'
import find from 'pouchdb-find'
import rel from 'relational-pouch'

@Injectable({
    providedIn: 'root'
})
export class PouchDBService {

    public base_db: PouchDB.Database
    public rel

    constructor() {
        PouchDB.plugin(find)
        PouchDB.plugin(rel)
        this.base_db = new PouchDB('Eeeek')
        this.rel = this.base_db.setSchema(schema)
        this.rel.save('project', {
            name: 'George R. R. Martin', id: 1, books: [6, 7]
        })
    }
}

当我尝试调用 this.rel.find(id) 时,它似乎忽略了 relational-pouch 定义并使用了 pouch-find 定义。所以 this.rel.find(id) 结果是 Error: you must provide search parameters to find()

但是

            this.db.rel.find({
                selector: {
                    type: this.type
                }
            })

有效。

依赖项似乎很好,我很困惑,非常感谢任何帮助。

谢谢。

ps。使用 angular 12.

您没有像宣传的那样使用 rel 字段。从类型声明 rel 定义为

interface RelDatabase<Content extends {} = {}> extends Database<Content> {
   rel: RelDB;
}

所以我不明白这段代码是如何编译的
它正在编译,因为 rel 隐含为 any

   public base_db: PouchDB.Database
   public rel
    . . . 
   this.rel = this.base_db.setSchema(schema)
   this.rel.save('project', {
      name: 'George R. R. Martin', id: 1, books: [6, 7]
   })

这是 Typescript 的一个好处,可以让您省去很多疑惑:

public rel: PouchDB.RelDatabase;

这就是您要找的(有点)

   this.rel = this.base_db.setSchema(schema)
   this.rel.rel.save('project', {
      name: 'George R. R. Martin', id: 1, books: [6, 7]
   })

但这读起来很糟糕 - 我推荐

export class PouchDBService {
   // why have a service if these are public...
   private db: PouchDB.Database;
   private rdb: PouchDB.RelDatabase;

无论如何,这里的主要内容是使用显式类型。这显然是正确的:

db: PouchDB.Database;
rdb: PouchDB.RelDatabase;

async demoRelDb(dbName: string): Promise<any> {
    PouchDB.plugin(find).plugin(rel);
    this.db = new PouchDB(dbName);  
    this.rdb = this.db.setSchema([
        { singular: "author", plural: "authors", relations: { books: { hasMany: "book" } } },
        { singular: "book", plural: "books", relations: { author: { belongsTo: "author" } } },
    ]);
    
    await this.rdb.rel.save("author", {
        name: "George R. R. Martin",
        id: 1,
        books: [6, 7],
    });         
    let result await this.rdb.rel.find("author", 1);
    console.log(JSON.stringify(doc, undefined, 3));
}

好的,现在你应该上路了。但是我警告人们不要使用这个插件,因为它看起来实际上已经被废弃了,问题 #125 是一个阻碍。

直到进行一些维护 - 有 16 个 pull requests 跨越 2 年 - 我不会使用它。如果有的话,寻找一个可行的叉子。