“initialize_app '默认的 Firebase 应用已经存在。”云函数 pub sub
Posted
技术标签:
【中文标题】“initialize_app \'默认的 Firebase 应用已经存在。”云函数 pub sub【英文标题】:"initialize_app 'The default Firebase app already exists." Cloud functions pub sub“initialize_app '默认的 Firebase 应用已经存在。”云函数 pub sub 【发布时间】:2019-11-02 16:51:57 【问题描述】:我正在 Google Cloud(云函数内联编辑器)上编写一个 pub 子函数,它将每半小时触发一次,它使用 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 应用程序。这是我怀疑这是问题所在的代码部分: p>
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()
这仍然不起作用。同样,这在第一次触发该函数时有效,但之后它会不断崩溃。
有什么建议吗?
感谢您的帮助!
【问题讨论】:
【参考方案1】:由于这是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
客户端之间的区别是“大写 C”,您必须在您的机器上安装 firestore python 库以开发和测试并修改您的 requirements.txt
【讨论】:
【参考方案2】:如果它是一个云函数,标记的解决方案将有相同的错误,因为您可以同时运行同一个云函数的多个实例,这意味着您的应用程序已经被初始化。
你可能想用这个:
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 并返回具有给定的 App 实例名字
delete_app()它会优雅地删除一个 App 实例
【讨论】:
以上是关于“initialize_app '默认的 Firebase 应用已经存在。”云函数 pub sub的主要内容,如果未能解决你的问题,请参考以下文章