【问题标题】:initializeApp when adding firebase to app and to server将firebase添加到应用程序和服务器时的initializeApp
【发布时间】:2020-01-05 21:46:02
【问题描述】:

我将 firebase 用于 auth 和 db,将 AWS lambda 用于云功能。

要将 firebase 添加到我的 JS 项目中,我将 initializeApp 使用 firebase 配置作为参数,如此处所述:https://firebase.google.com/docs/web/setup

如此处所述:https://firebase.google.com/docs/admin/setup,我还需要在我的 lambda 函数中使用 initializeApp

这里有如下内容:

const admin = require('firebase-admin');
const serviceAccount = require('../path/to/service-account.json');

const firebaseAdmin = admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "dB_URL"
});

凭据来自 firebase-admin 库,因此我无法将其添加到我的 web firebase 配置中。所以,我需要初始化两次。

但是,如果我这样继续,服务器会抛出一个错误:

默认 Firebase 应用已存在。这意味着您多次调用 initializeApp() 而不提供应用程序名称作为第二个参数。在大多数情况下,您只需要调用一次 initializeApp()。但如果您确实要初始化多个应用程序,请将第二个参数传递给 initializeApp(),以便为每个应用程序指定一个唯一的名称。

我在这里遗漏了什么吗?最佳做法是什么?我很困惑。

似乎之前有人遇到过同样的问题:Use Firebase SDK with Netlify Lambda Functions

对这个用户有用的是使用此处记录的 REST API:https://firebase.google.com/docs/projects/api/workflow_set-up-and-manage-project

文档说它处于测试阶段。

感谢您的帮助

【问题讨论】:

    标签: node.js firebase aws-lambda firebase-admin


    【解决方案1】:

    有类似的问题。基于@Frank van Puffelen 的回答(感谢他),现在,使用 ES6(Firebase admin V >= 9)

    import { initializeApp, applicationDefault, getApps } from "firebase-admin/app";
    
    ...
    
            if ( !getApps().length ) {
                initializeApp({
                    credential: applicationDefault(),
                    databaseURL: 'https://XXXXXXX.firebaseio.com'
                });
            }
    ...
    

    【讨论】:

      【解决方案2】:

      尝试删除 const firebaseAdmin = ...,因为您已经可以使用 admin 来调用 firebase 服务。只需使用

      admin.initializeApp(
      {
          credential: admin.credential.cert(serviceAccount),
          databaseURL: "dB_URL"
      });
      

      那么,你可以走了。

      【讨论】:

      • 这并不能阻止人们对其进行两次初始化。您的评论与手头的问题无关。
      【解决方案3】:

      似乎 lambda 可能会加载多次调用admin.initializeApp({...}) 的脚本文件。为防止 Admin SDK 多次初始化,您可以例如检测是否已经发生:

      if (!admin.apps.length) {
          const firebaseAdmin = admin.initializeApp({
              credential: admin.credential.cert(serviceAccount),
              databaseURL: "dB_URL"
          });
      }
      

      【讨论】:

      • 太棒了。那行得通。谢谢你的提示。现在我有另一个相关的问题:我可以声明一个文档引用。但是,获取该文档中包含的数据的 get() 请求会返回以下错误消息:“获取文档时出错:TypeError [ERR_INVALID_ARG_TYPE]:“路径”参数必须是字符串类型。收到的类型号”。这是从捕获中记录的错误,如此处所述:firebase.google.com/docs/firestore/query-data/get-data。无法判断它是否与 Firebase 相关。抱歉,如果不是。
      • 看起来您正在传递一个数字,而键/ID 始终是字符串。如果它们是数值,请先将其转换为带有 42.toString()''+42 之类的字符串。请注意,一般来说,最好为......呃......这样的新问题打开一个新问题。 ;-)
      • 对不起,我不明白。我在哪里传递一个数字?我正在做一个基本的获取请求,如官方文档中所述。您指的是哪些键/ID? (注意。我不确定,因为它有点相关)
      • 如果我的评论解释不够清楚,请使用minimal standalone code that anyone can run to reproduce the problem 提出新问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 2018-03-13
      相关资源
      最近更新 更多