"initialize_app 'The default Firebase app already exists." 云函数发布订阅

"initialize_app 'The default Firebase app already exists." Cloud functions pub sub

我正在 Google Cloud(云函数内联编辑器)上编写一个发布子函数,它每半小时触发一次,它使用 firestore。由于某种原因,该函数在第一次运行时会正常触发,但之后不断弹出以下错误:

in initialize_app 'The default Firebase app already exists. This means you 
called ' ValueError: The default Firebase app already exists. This means you 
called initialize_app() more than once without providing an app name as the 
second argument. In most cases you only need to call initialize_app() once. 
But if you do want to initialize multiple apps, pass a second argument to 
initialize_app() to give each app a unique name.

我以前在使用两个应用程序时遇到过这个错误,但这个功能 仅使用一个 firebase 应用程序。 这是我怀疑这是我的代码部分问题:

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

def hello_pubsub(event, context):
    pubsub_message = base64.b64decode(event['data']).decode('utf-8')
    fire = {<My firebase credentials>}
    cred = credentials.Certificate(fire)
    default_app = firebase_admin.initialize_app(cred)
    db = firestore.client()
    ........

我认为问题正是错误所说的,我没有声明应用程序的名称,所以我尝试了这个(以及其他尝试):

default_app = firebase_admin.initialize_app(cred,'App')
# other attempt
default_app = firebase_admin.initialize_app()

这仍然不起作用。同样,这在第一次触发该功能时有效,但之后它不断崩溃。

有什么建议吗?

感谢您的帮助!

由于这是 cloud-function,您不需要使用凭据,该函数将从环境中获取凭据。 我建议为此更改您的功能:

import firebase_admin
from firebase_admin import firestore

firebase_admin.initialize_app()
db = firestore.client()


def hello_pubsub(event, context):
    pubsub_message = base64.b64decode(event['data']).decode('utf-8')
    # Do your things

在部署之前使用您的函数时使用凭据,然后在部署时删除凭据部分,因为您不需要它。

此外,如果您不需要 firebase_admin 除了导入 firestore,您可以跳过初始化 firebase_app 并像这样单独使用 firestore:

import base64

from google.cloud import firestore

db = firestore.Client()


def hello_pubsub(event, context):
    pubsub_message = base64.b64decode(event['data']).decode('utf-8')
    # Do your things

注意 Firebase firestore 客户端和 google-cloud firestore 客户端之间的区别是 "Capital C" 并且您必须安装 firestore python 库您的机器用于开发和测试以及修改您的 requirements.txt

如果它是云函数,则标记的解决方案将出现相同的错误,因为您可以同时 运行 同一云函数的多个实例,这意味着您的应用程序已经初始化。

你可能想用这个:

from firebase_admin import initialize_app, delete_app, get_app

try:
    default_app = get_app()
except ValueError:
    default_app = initialize_app()

your code here

try:
    delete_app(default_app)
except ValueError:
    pass

get_app() 将尝试获取 name=_DEFAULT_APP_NAME 和 return 返回具有给定名称的 App 实例

delete_app() 那么它会优雅地删除一个 App 实例