firebase 无法使用从应用程序传递的Firestore对象从自定义npm包读取Firestore DB

egdjgwm8  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(98)

我正在尝试编写我自己的npm包使用Firestore数据库。我用从应用程序传递的Firestore对象初始化包中的类:

import { firestoreTest } from 'my-package'

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

字符串
当我从我的包await test.getDoc('pathto/doc')调用函数时,我得到了错误:Uncaught (in promise) FirebaseError: Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore
我尝试了初始化Firestore对象的不同组合,用于读取Firestore。只有当我使用firebaseConfig完全初始化我的包中的Firebase应用程序时,我才能从Firestore读取,但我不会从父应用程序继承身份验证,只能读取可公开访问的集合。
我甚至试图传递doc(db, documentPath)到包,然后我得到了一个错误,给予了我可能发生的事情的提示:Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?
因此,我认为使用Firebase从我的包创建单独的Firebase SDK示例。
我在我的应用程序和包中使用相同的firebase包版本,也将firebase包设置为对等依赖。
我希望无缝地使用相同的Firebase对象初始化在我的包中的主应用程序。
有人能帮助我理解我是否可以做些什么来实现这一点吗?
下面是我的测试包中的代码。

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


更新
我试着从本地源安装软件包,并使用符号链接到我的本地仓库,但没有帮助。
然后我把我的包仓库推到GitHub,并以GitHub仓库为源安装包,现在它可以工作了。
看起来当使用本地源代码时,我的包总是使用Firebase的单独示例。把整个软件包项目文件夹放在我的应用程序文件夹中,并像应用程序的一部分一样使用软件包也没有帮助。
从GitHub安装并不是一个开发解决方案,所以我最终在我的应用程序项目中创建了一个文件夹,我把所有的包文件都放在那里,就像我的应用程序的一部分一样。编辑后,我将复制到软件包。
我不确定是否有更好的解决方案。
更新
我找到了relative-deps包,它解决了我的开发问题。

9ceoxa92

9ceoxa921#

由于原始海报通过编辑问题回答了他/她的问题。发布此内容以获得社区的可见性:
npm中,relative-deps指的是一个允许您使用本地包或工作区内的相对文件路径定义依赖项的功能。
此功能是在npm版本7中添加的。您可以直接引用项目中的其他包或模块,而不是依赖于包名称和npm注册表。
这使得开发更容易,特别是对于使用monorepos或许多相互关联的包的项目。根据package.json文件中指定的文件路径,npm解析并安装依赖项。

注意:* 只有v7及以后的npm版本开始支持此功能。*

相关问题