Heim > Fragen und Antworten > Hauptteil
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 的引用?
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粉0806439752023-09-11 09:27:04
由于原始发帖者通过编辑问题回答了他/她的问题。发布此内容是为了提高社区的知名度:
在 npm
中,relative-deps
指的是一种功能,可让您使用本地包或工作空间内的相对文件路径定义依赖项。
此功能是在 npm
版本 7 中添加的。您可以直接引用项目中的其他包或模块,而不是依赖包名称和 npm
注册表。 p>
这使得开发更加容易,特别是对于使用 monorepos 或大量相互关联的包的项目。 npm
根据 package.json
文件中指定的文件路径解析并安装依赖项。
注意:只有以 v7 及更高版本开头的 npm 版本支持此功能。