Глобальная инициализация приложения Firebase Admin SDK в Node.js - PullRequest
1 голос
/ 14 января 2020

Я создаю приложение Express. js, использующее Firebase Admin SDK для нескольких функций, таких как проверка идентификатора токена и доступ к Cloud Firestore. В моем основном файле приложения. js я инициализирую приложение следующим образом:

const admin = require('firebase-admin')

const serviceAccount = require('../config/account-credentials.json')
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: 'https://databaseurl.firebaseio.com'
})

В другом файле все, что я делаю, это импортирую:

const admin = require('firebase-admin')

Я могу позвонить admin.auth().verifyIdToken и проверить токены ID просто отлично. Однако, когда я звоню app.database(), он жалуется, что приложение никогда не инициализируется. При повторной инициализации приложения возникает новая ошибка:

Приложение Firebase по умолчанию уже существует. Это означает, что вы вызывали initializeApp () более одного раза без указания имени приложения в качестве второго аргумента. В большинстве случаев вам нужно вызывать initializeApp () только один раз. Но если вы хотите инициализировать несколько приложений, передайте initializeApp () второй аргумент, чтобы дать каждому приложению уникальное имя.

Нужно ли создавать несколько приложений с разными именами, чтобы это работало? Или как я могу использовать одно приложение на протяжении всего проекта.

1 Ответ

0 голосов
/ 14 января 2020

Вы должны инициализировать свое приложение ровно один раз, а затем повторно использовать эту ссылку. Есть несколько способов сделать это, но я предпочитаю импортировать firebase.ts (который инициализирует приложение и службы Firebase) в мой index.ts (или какова бы ни была ваша точка входа). Затем я передаю ссылку на любые другие файлы, которые нуждаются в конкретной службе. Я использую TypeScript, поэтому настройте его по мере необходимости, если вы используете vanilla JS.

firebase.ts

import * as admin from 'firebase-admin';

// Initialize our project application
admin.initializeApp();

// Set up database connection
const firestoreDb: FirebaseFirestore.Firestore = admin.firestore();
firestoreDb.settings({ timestampsInSnapshots: true });
export const db = firestoreDb;

Мой файл index.ts импортирует его:

import { db } from './firebase';

Затем, когда я настрою свои маршруты с помощью Express, у меня будет каждый маршрут в другом файле со своей функцией. Затем передайте ссылку на БД на любой, кому это нужно.

  app
    .route('events')
    .get((req: Request, res: Response) => {
      get_events(db, res);
      return;
    });

Вот сообщение в блоге, где я объясняю это немного подробнее:

https://medium.com/@jasonbyrne / с практическими рекомендациями -structure-a-serverless-rest-api-with-firebase-functions- express -1d7b93aaa6af

Если вам не нравится метод внедрения зависимостей или вы предпочитаете только отложенную загрузку сервисов Вы должны, вы могли бы go другой это по-другому. В этом методе у вас будет файл firebase.js (или как вы его называете), который вы импортируете на любые страницы, которые в нем нуждаются, и вызываете функцию для загрузки этой службы. Здесь я просто делаю Firestore, но вы можете создать аналогичные функции для ссылок на другие сервисы.

Просто напечатайте это как пример ...

import * as admin from 'firebase-admin';

// Initialize our project application
admin.initializeApp();

// Database reference, not yet loaded
let db: FirebaseFirestore.Firestore | null = null;

// Get cached db reference or create it
export function getDatabaseReference() {
    if (db === null) {
        db = admin.firestore();
    }
    return db;
}

Надеюсь, это поможет. Дайте мне знать, если у вас есть какие-либо вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...