Firebase getAuth() 抛出未定义的 getProvider 错误,但可以访问数据库

Sco*_*ott 4 node.js firebase-authentication firebase-admin

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

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...
   }
}
Run Code Online (Sandbox Code Playgroud)

它会抛出以下错误:

返回 app.container.getProvider(name); 类型错误:无法读取未定义的属性“getProvider”

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

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

然而“console.log(“App Name...”)”行产生:

应用程序名称=[默认]

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

到底他妈发生了什么?

小智 14

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

另外,我使用 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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 正确的答案。没有人提到“firebase-admin/auth”——干得好 (3认同)

小智 11

您将 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
*/
Run Code Online (Sandbox Code Playgroud)

如果您在后端,只需用于adminApp.auth()获取 Auth 实例。如果在前端,则需要getAuth使用前端Firebase App实例进行调用:

import { initializeApp } from 'firebase/app'
import { getAuth } from 'firebase/auth'

const app = initializeApp(...)
const auth = getAuth(app)
Run Code Online (Sandbox Code Playgroud)

  • 你好。在尝试“myapp.auth()”(我之前尝试过但无济于事,但事实证明我必须停止/重新启动节点服务器,因为身份验证值被缓存)之后,我发现我可以访问管理功能。话虽这么说,这表明 Firebase Admin SDK 文档存在问题,因为有一个关于“firebase-admin/auth”的部分显示在其示例中使用 getAuth(),以及“getAuth().createUser( ...”示例,这就是我想要做的。Arrrrg。我喜欢文档错误而你只是旋转几个小时的轮子。谢谢。 (2认同)