Что такое свойство `app` при доступе к дочерней базе данных firebase (javascript) - PullRequest
0 голосов
/ 24 апреля 2020

Это мой файл, который инициализирует firebase:

export default class {
  static parent = RNFirebase.initializeApp();
  static child = null;

  constructor() {
    child = this.parent.database('child-database-url');
  }
}

В другом файле я использую это как:

import FDBS from '../initializer';

FDBS.child.app.database().ref('orders').once("value", data => {
  console.log(data);
});

И эта строка кода смущает меня: FDBS.child.app.database().ref( на самом деле .app. Почему мне нужно получить доступ к этому свойству, чтобы получить данные, на самом деле то, что я пытаюсь получить, - это возможность писать код вроде: FDBS.child.database().ref('orders').once(...

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Для начала давайте исправим синтаксическую ошибку, касающуюся переменных "stati c" в вашем файле initializer.js. Вместо использования класса для такой простой структуры данных, просто экспортируйте объект.

import RNFirebase from '@react-native-firebase/app';
import '@react-native-firebase/database';

// inits & returns the default FirebaseApp instance
const parent = RNFirebase.initializeApp(); // or RNFirebase.app() if initialized automatically

// gets a FirebaseDatabase instance that points to 'child-database-url'
const child = parent.database('child-database-url');

export default {
  parent, // this is a FirebaseApp object
  child   // this is a FirebaseDatabase object
}

Теперь, как показано в приведенном выше фрагменте, ваш parent объект является экземпляром FirebaseApp объект и child объект являются экземпляром FirebaseDatabase объекта.

В вашем коде, который загружается в FDBS, вы получаете доступ к FDBS.child.app ( ссылка ), которая возвращает объект FirebaseApp, связанный с этим экземпляром FirebaseDatabase - в вашем случае это объект FDBS.parent.

Поскольку два объекта имеют разные типы, я рекомендую выбрать экспортировать либо два FirebaseApp экземпляра, либо два FirebaseDatabase экземпляра.

Export FirebaseApp instance

Исходя из вашего вопроса, вы, вероятно, ожидаете, что объект child также объект FirebaseApp, потому что вы хотите вызвать FDBS.child.database().ref(...).

import RNFirebase from '@react-native-firebase/app';
import '@react-native-firebase/database';

const parent = RNFirebase.initializeApp(/* config */); // or RNFirebase.app()
const child = RNFirebase.initializeApp({
  ...parent.options, // copies everything from the default app's configuration
  databaseURL: 'child-database-url' // but overwrites the value of databaseURL
});

export default {
  parent, // this is a FirebaseApp object that uses the default "parent" database
  child   // this is a FirebaseApp object that uses the "child" database
}

. Вы могли бы использовать это следующим образом:

import FDBS from '../initializer';

FDBS.child.database().ref('orders').once("value", data => {
  console.log(data);
});

При таком подходе возникает проблема, когда вы используете аутентификацию. Если пользователь войдет в ваше приложение, он войдет в систему для экземпляра FirebaseApp по умолчанию, но не для экземпляра, используемого FDBS.child (если вы явно не сделаете этого). Из-за этого я рекомендую другой подход.

Экспорт FirebaseDatabase экземпляров (рекомендуется)

import RNFirebase from '@react-native-firebase/app';
import '@react-native-firebase/database';

const defaultApp = RNFirebase.initializeApp(/* config */); // or RNFirebase.app()

const dbParent = defaultApp.database();
const dbChild = defaultApp.database('child-database-url');

export default {
  // app: defaultApp, // (if you want to export the FirebaseApp object too)
  parent: dbParent, // this is a FirebaseDatabase object that points to the default "parent" database
  child: dbChild    // this is a FirebaseDatabase object that points to the "child" database
}

Вы могли бы использовать это следующим образом:

import FDBS from '../initializer';

FDBS.child.ref('orders').once("value", data => {
  console.log(data);
});

Примечание: Не забывайте обрабатывать ошибки. Я рекомендую использовать обещания, а не обратные вызовы.

0 голосов
/ 26 апреля 2020

Изменить в ответ на ваш комментарий

Вы не показываете, откуда взялась RNFirebase, но у вас должна быть возможность доступа к вашей базе данных, например

let initapp = RNFirebase.initializeApp()
let db = initapp.database('url')
db.ref....

Прямо сейчас вы сделали это окольным путем

child = this.parent.database (

И если вы проверите, как вы определяете родителя, это в основном похоже на фрагмент, который я предоставил выше.

Так что вы можете быть чуть более кратким и менее округлым.

-

Из официальных документов: https://firebase.google.com/docs/reference/js/firebase.database.Database#app

Приложение, связанное с экземпляром службы базы данных.

Где приложение имеет свойство базы данных, среди прочих https://firebase.google.com/docs/reference/js/firebase.app.App#database

Получает службу базы данных для текущего приложения. Пример

var database = app.database();
// The above is shorthand for:
// var database = firebase.database(app);  
...