Impossible de lire la base de données Firestore à partir du package npm personnalisé à l'aide de l'objet Firestore transmis depuis l'application
P粉064448449
P粉064448449 2023-09-10 19:49:11
0
1
526

J'essaie d'écrire mon propre package npm qui utilise la base de données Firestore. J'initialise la classe du package en utilisant l'objet Firestore passé depuis l'application :

import { firestoreTest } from 'my-package'

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

Lorsque j'appelle la fonction depuis le package await test.getDoc('pathto/doc') J'obtiens l'erreur : 未捕获(承诺中)FirebaseError:预计 collection() 的第一个参数是 CollectionReference、DocumentReference 或 FirebaseFirestore

J'ai essayé différentes combinaisons d'initialisation d'objets Firestore pour la lecture à partir de Firestore. Ce n'est que lorsque j'initialise complètement l'application Firebase dans le package utilisant firebaseConfig que je peux lire les données de Firestore, mais je n'hérite pas de l'authentification de l'application parent et je ne peux lire que les collections accessibles au public.

J'ai même essayé d'ajouter doc(db, documentPath) 传递给包,然后出现错误,提示我可能发生的情况:类型与预期实例不匹配。您是否传递了来自不同 Firestore SDK 的引用?

J'ai donc pensé qu'utiliser Firebase à partir de mon package créerait une instance SDK Firebase distincte.

J'utilise la même version du package Firebase dans mon application et mon package et je définis également le package Firebase comme dépendance homologue.

Je souhaite utiliser de manière transparente le même Firebase objet initialisé dans l'application principale de mon package.

Quelqu'un peut-il m'aider à comprendre si je peux faire quelque chose pour y parvenir ?

Voici le code de mon package de test.

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())
  }
}

Mise à jour

J'ai essayé d'installer le package à partir de sources locales et d'utiliser des liens symboliques vers mon référentiel local, mais cela n'a pas aidé.

Ensuite, j'ai poussé mon référentiel de packages sur GitHub et installé le package en utilisant le référentiel GitHub comme source et maintenant cela fonctionne.

Il semble que lors de l'utilisation de sources locales, mes packages utilisent toujours une instance Firebase distincte. Placer l'intégralité du dossier du projet du package dans mon dossier d'application et utiliser un package partiel comme l'application n'a pas non plus aidé.

L'installation à partir de GitHub n'est pas une solution de développement, j'ai donc fini par créer des dossiers dans mon projet d'application et y placer tous les fichiers du package comme s'ils faisaient partie de mon application. Après les avoir modifiés, je les copierai dans le référentiel de packages.

Je ne sais pas s’il existe une meilleure solution.

Mise à jour

J'ai trouvé le package relative-deps qui a résolu mes problèmes de développement.

P粉064448449
P粉064448449

répondre à tous(1)
P粉080643975

Puisque l'affiche originale a répondu à sa question en éditant la question. Ce contenu est publié pour accroître la notoriété de la communauté :


in npm 中,relative-deps fait référence à une fonctionnalité qui vous permet de définir des dépendances à l'aide de chemins de fichiers relatifs dans un package local ou un espace de travail.

Cette fonctionnalité est disponible dans le registre npm 版本 7 中添加的。您可以直接引用项目中的其他包或模块,而不是依赖包名称和 npm. p>

Cela facilite le développement, en particulier pour les projets utilisant des monorepos ou un grand nombre de packages interdépendants. npm 根据 package.json Les chemins de fichiers spécifiés dans le fichier sont résolus et les dépendances sont installées.


Remarque : Seules les versions npm commençant par la v7 et supérieure prennent en charge cette fonctionnalité.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal