Heim  >  Fragen und Antworten  >  Hauptteil

Die Firestore-Datenbank kann nicht aus dem benutzerdefinierten NPM-Paket mit dem von der Anwendung übergebenen Firestore-Objekt gelesen werden

Ich versuche, mein eigenes npm-Paket zu schreiben, das die Firestore-Datenbank verwendet. Ich initialisiere die Klasse aus dem Paket mit dem von der Anwendung übergebenen Firestore-Objekt:

import { firestoreTest } from 'my-package'

const app = initializeApp(firebaseConfig)
const db = getFirestore(app)
const test = new firestoreTest(db)

Wenn ich die Funktion aus dem Paket aufrufe await test.getDoc('pathto/doc') erhalte ich die Fehlermeldung: 未捕获(承诺中)FirebaseError:预计 collection() 的第一个参数是 CollectionReference、DocumentReference 或 FirebaseFirestore

Ich habe verschiedene Kombinationen der Initialisierung von Firestore-Objekten zum Lesen aus Firestore ausprobiert. Erst wenn ich die Firebase-App im Paket mit firebaseConfig vollständig initialisiere, kann ich Daten aus Firestore lesen, erbe dann aber nicht die Authentifizierung von der übergeordneten App und kann nur öffentlich zugängliche Sammlungen lesen.

Ich habe sogar versucht, doc(db, documentPath) 传递给包,然后出现错误,提示我可能发生的情况:类型与预期实例不匹配。您是否传递了来自不同 Firestore SDK 的引用?

hinzuzufügen

Also dachte ich, dass die Verwendung von Firebase aus meinem Paket eine separate Firebase SDK-Instanz erstellen würde.

Ich verwende in meiner App und meinem Paket die gleiche Firebase-Paketversion und lege die Paket-Firebase auch als Peer-Abhängigkeit fest.

Ich möchte nahtlos dasselbe Firebase Objekt verwenden, das in der Haupt-App meines Pakets initialisiert wurde.

Kann mir jemand helfen zu verstehen, ob ich etwas tun kann, um dies zu erreichen?

Dies ist der Code aus meinem Testpaket.

export class firestoreTest {
  private db: Firestore
  private app: FirebaseApp
  private dbFromApp: Firestore
  private localApp: FirebaseApp
  private localDb: Firestore

  constructor(firebaseConfig: FirebaseOptions, app: FirebaseApp, db: Firestore) {
    this.db = db
    this.app = app

    this.dbFromApp = getFirestore(app)

    this.localApp = initializeApp(firebaseConfig)
    this.localDb = getFirestore(this.localApp)
  }

  public async getDoc(docPath: string, ref?: DocumentReference<DocumentData, DocumentData>) {
    /* Reads data, but without authenticated user context */
    /* Uncaught (in promise) FirebaseError: Missing or insufficient permissions. */
    // const data = await getDoc(doc(this.localDb, docPath).withConverter(converter<any>()))

    /* Uncaught (in promise) FirebaseError: Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore */
    // const data = await getDoc(doc(this.dbFromApp, docPath).withConverter(converter<any>()))

    /* Uncaught (in promise) FirebaseError: Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore */
    const data = await getDoc(doc(this.db, docPath).withConverter(converter<any>()))

    /* Uncaught (in promise) FirebaseError: Type does not match the expected instance. Did you pass a reference from a different Firestore SDK? */
    // const data = ref && (await getDoc(ref.withConverter(converter<any>())))

    console.log(data?.data())
  }
}

Update

Ich habe versucht, das Paket aus lokalen Quellen zu installieren und Symlinks zu meinem lokalen Repository zu verwenden, aber das hat nicht geholfen.

Dann habe ich mein Paket-Repository auf GitHub übertragen und das Paket mit dem GitHub-Repository als Quelle installiert und jetzt funktioniert es.

Es scheint, dass meine Pakete bei der Verwendung lokaler Quellen immer eine separate Firebase-Instanz verwenden. Es hat auch nicht geholfen, den gesamten Projektordner des Pakets in meinen Anwendungsordner zu legen und Teilpakete wie eine App zu verwenden.

Die Installation über GitHub ist keine Entwicklungslösung, daher habe ich in meinem App-Projekt Ordner erstellt und alle Paketdateien darin abgelegt, als wären sie Teil meiner App. Nachdem ich sie bearbeitet habe, kopiere ich sie in das Paket-Repository.

Ich weiß nicht, ob es eine bessere Lösung gibt.

Update

Ich habe das Paket relative-deps gefunden, das meine Entwicklungsprobleme gelöst hat.

P粉064448449P粉064448449405 Tage vor499

Antworte allen(1)Ich werde antworten

  • P粉080643975

    P粉0806439752023-09-11 09:27:04

    由于原始发帖者通过编辑问题回答了他/她的问题。发布此内容是为了提高社区的知名度:


    npm 中,relative-deps 指的是一种功能,可让您使用本地包或工作空间内的相对文件路径定义依赖项。

    此功能是在 npm 版本 7 中添加的。您可以直接引用项目中的其他包或模块,而不是依赖包名称和 npm 注册表。

    这使得开发更加容易,特别是对于使用 monorepos 或大量相互关联的包的项目。 npm 根据 package.json 文件中指定的文件路径解析并安装依赖项。


    注意只有以 v7 及更高版本开头的 npm 版本支持此功能。

    Antwort
    0
  • StornierenAntwort