将 firebase 添加到应用程序和服务器时的 initializeApp

Joh*_*Doe 10 node.js firebase aws-lambda firebase-admin

我将 firebase 用于 auth 和 db,并将 AWS lambda 用于云函数。

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

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

如下:

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

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

但是,如果我这样做,服务器将抛出错误:

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

我在这里错过了什么吗?最佳做法是什么?我糊涂了。

之前有人遇到过同样的问题:使用 Firebase SDK 和 Netlify Lambda 函数

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

文档说它处于测试阶段。

感谢您的帮助

Fra*_*len 32

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

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


Bay*_*ayu 9

有类似的问题。基于@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'
            });
        }
...
Run Code Online (Sandbox Code Playgroud)