【问题标题】:Firebase getAuth() throws error getProvider of undefined but can access databaseFirebase getAuth() 抛出未定义的错误 getProvider 但可以访问数据库
【发布时间】:2021-12-21 03:20:55
【问题描述】:

我在 Node 服务器上运行以下代码。

import admin from 'firebase-admin';
import {getAuth} from 'firebase/auth';
class MyFirebase {

   constructor() {
     console.log("MyFirebase Constructor");
     this.firebaseApp = admin.initializeApp({
          credential: admin.credential.cert("PATH_TO_CERT/cert.json"),
          databaseURL: "https://DATABASE_URL",
      });
      
      console.log("App name="+firebaseApp.name);

      this.defaultAuth = getAuth(firebaseApp);
      this.database = this.firebaseApp.database();
      // database ref code here...
   }
}

它会抛出以下错误:

return app.container.getProvider(name); TypeError:无法读取未定义的属性“getProvider”

如果我从 getAuth(..) 调用中删除“firebaseApp”,我会收到此错误:

没有创建 Firebase 应用“[DEFAULT”] - 调用 Firebase App.initializeApp() (app/no-app)

但是“console.log("App Name...")" 行会产生:

应用名称=[DEFAULT]

很明显,已经创建了一个默认应用程序。此外,如果我删除“getAuth...”调用,数据库调用从下面的实时数据库中提取数据就可以正常工作,这似乎意味着身份验证工作正常,因为我可以访问数据库中的数据。

这到底是怎么回事?

【问题讨论】:

    标签: node.js firebase-authentication firebase-admin


    【解决方案1】:

    您将 Firebase Admin SDK (Node.js) 与 Firebase Javascript SDK 混淆了。前者用于后端,后者用于前端。我理解您的困惑,因为前端包可以通过 NPM 安装,尽管它们应该与前端代码捆绑在一起。

    你不能这样做:

    import admin from 'firebase-admin' // back-end code
    import { getAuth } from 'firebase/auth' // front-end code !!!
    
    const adminApp = admin.initializeApp(...)
    getAuth(adminApp) // TypeScript actually catches this error
    /*
    Argument of type 'App' is not assignable to parameter of type 'FirebaseApp'.
      Property 'automaticDataCollectionEnabled' is missing in type 'App' but required in type 'FirebaseApp'.ts(2345)
    app-public.d.ts(92, 5): 'automaticDataCollectionEnabled' is declared here.
    const adminApp: admin.app.App
    */
    

    如果您在后端,只需使用 adminApp.auth() 获取 Auth 实例。如果在前端,您需要使用前端 Firebase 应用实例调用 getAuth

    import { initializeApp } from 'firebase/app'
    import { getAuth } from 'firebase/auth'
    
    const app = initializeApp(...)
    const auth = getAuth(app)
    

    【讨论】:

    • 嗨。不幸的是,不,这不是我已经尝试过的问题。我确实了解前端/后端,这是后端(管理员的东西)。 Admin SDK 的 Firebase 文档展示
    • 嗨。在尝试“myapp.auth()”(我之前尝试过但无济于事但结果我不得不停止/重新启动节点服务器,因为缓存了身份验证值)之后,我发现我可以使用管理功能。话虽这么说,这表明 Firebase Admin SDK 文档有问题,因为“firebase-admin/auth”部分显示在他们的示例中使用 getAuth(),以及“getAuth().createUser( ...”示例,这就是我正在尝试做的。Arrrrrg。当文档错误并且您只需转动轮子几个小时时,我喜欢它。谢谢。
    【解决方案2】:

    新的模块化 api 的语法略有不同。如果您将它包装在一个类中,以下应该仍然有效,但只要您只在您的快递顶部执行一次?您不需要使用类的服务器。

    此外,我使用的是 require 语法,但导入也应该可以工作,具体取决于您的设置。

    //Import each function from the correct module.
    const { initializeApp, applicationDefault } = require("firebase-admin/app");
    const { getAuth } = require("firebase-admin/auth");
    const { getDatabase } = require("firebase-admin/database");
    
    const app = initializeApp({
          credential: applicationDefault(), //Don't forget to export your configuration json https://firebase.google.com/docs/admin/setup
          databaseURL: "https://DATABASE_URL",
      });
    
    const auth = getAuth(app)
    const database = getDatabase(app)
    

    文档记录不是很好,但您可以在 Admin SDK 参考中找到提示:https://firebase.google.com/docs/reference/admin/node/firebase-admin.auth

    一个提示:在 VSCode 中,如果您的导入路径格式正确,当您将鼠标悬停在每个函数上时,您应该会看到它们的描述。

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 2021-04-08
      • 2021-10-20
      • 2020-07-09
      • 2023-03-04
      • 2021-11-03
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      相关资源
      最近更新 更多