"initialize_app '. Приложение Firebase по умолчанию уже существует." Облачные функции Pub Sub - PullRequest
1 голос
/ 20 июня 2019

Я пишу функцию sub pub в 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()

И это все еще не работает. Опять же, это работает при первом срабатывании функции, но после этого происходит постоянный сбой.

Есть предложения?

Спасибо за помощь!

1 Ответ

2 голосов
/ 20 июня 2019

Поскольку это 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 для импорта, кроме импорта хранилища огня, вы можете пропустить инициализацию firebase_app и использовать только хранилище огня следующим образом:

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», и вам необходимо установить на своем компьютере библиотеку python firestore для разработки и тестирования и изменения вашего requirements.txt

...