Приложение Firebase '[DEFAULT]' не создано Ошибка при попытке создать систему личных сообщений - PullRequest
0 голосов
/ 16 января 2020

Я создаю систему личных сообщений для приложения React Native, но не могу исправить ошибку, которая присутствует в моем приложении expo. Ошибка:

Firebase: No Firebase App '[DEFAULT]' has been created - call Firebase App.initializeApp() (app/no-app)

Код:

import FirebaseKeys from "./config";
import firebase from "firebase";
require("firebase/firestore");
import { COLLECTIONS } from './constants'

class Fire {
    constructor() {
        firebase.initializeApp(FirebaseKeys);
    }

    auth = firebase.auth();

    firestore = firebase.firestore();

    messageRef = this.firestore.collection(COLLECTIONS.MESSAGES);

    async signIn() {
      try {
        const response = await this.auth.signInAnonymously();
        return {user: response.user };
      } catch (error) {
        return { error };
      }
    }

    async fetchMessages() {
      const messages = await this.messageRef
        .orderBy('created_at', 'desc')
        .limit(10)
        .get();

      return messages.docs;
    }

    async createMessage({ message, uid }) {
      await this.messageRef.add({
        message,
        user_id: uid,
        created_at: new Date()
      })
    }

    createAndSendMessage = async ({ message, avatar, receiverId, image }) => {
      return new Promise((res, rej) => {
        this.firestore
          .collection("messages")
          .add({
            message: message,
            avatar: avatar,
            senderId: (firebase.auth().currentUser || {}).uid,
            receiverId: receiverId,
            image: image,
            timestamp: firebase.database.ServerValue.TIMESTAMP
          }).then(ref => {
            res(ref);
          })
          .catch(error => {
            ref(error);
          });
      });
    };

    addPost = async ({ text, localUri }) => {
        const remoteUri = await this.uploadPhotoAsync(localUri, `photos/${this.uid}/${Date.now()}`);

        return new Promise((res, rej) => {
            this.firestore
                .collection("posts")
                .add({
                    text: text,
                    uid: this.uid,
                    timestamp: this.timestamp,
                    image: remoteUri
                })
                .then(ref => {
                    res(ref);
                })
                .catch(error => {
                    rej(error);
                });
        });
    };

    uploadPhotoAsync = (uri, filename) => {
        return new Promise(async (res, rej) => {
            const response = await fetch(uri);
            const file = await response.blob();

            let upload = firebase
                .storage()
                .ref(filename)
                .put(file);

            upload.on(
                "state_changed",
                snapshot => {},
                err => {
                    rej(err);
                },
                async () => {
                    const url = await upload.snapshot.ref.getDownloadURL();
                    res(url);
                }
            );
        });
    };

    createUser = async user => {
        let remoteUri = null;

        try {
            await firebase.auth().createUserWithEmailAndPassword(user.email, user.password);

            let db = this.firestore.collection("users").doc(this.uid);

            db.set({
                name: user.name,
                email: user.email,
                avatar: null
            });

            if (user.avatar) {
                remoteUri = await this.uploadPhotoAsync(user.avatar, `avatars/${this.uid}`);

                db.set({ avatar: remoteUri }, { merge: true });
            }
        } catch (error) {
            alert("Error: ", error);
        }
    };

    off() {
      this.db.off();
    };

    get db() {
      return firebase.database().ref("messages");
    }

    get uid() {
      return (firebase.auth().currentUser || {}).uid;
    }

    signOut = () => {
        firebase.auth().signOut();
    };

    get firestore() {
        return firebase.firestore();
    }

    get uid() {
        return (firebase.auth().currentUser || {}).uid;
    }

    get name() {
      return firebase.auth().currentUser;
    }

    get email() {
      return firebase.auth().currentUser.email;
    }

    get avatar() {
      return firebase.auth().currentUser.avatar;
    }

    get timestamp() {
        return Date.now();
    }
}

Fire.shared = new Fire();
export default Fire;

Любая помощь будет в значительной степени признательна. Заранее спасибо! (Кроме того, если вам известны какие-либо учебные пособия о том, как создавать личные сообщения с помощью реагировать на native и firebase, пожалуйста, дайте мне знать, как я борюсь со всей задачей.)

1 Ответ

1 голос
/ 16 января 2020

Вам необходимо переместить следующие строки -

auth = firebase.auth();
firestore = firebase.firestore();
messageRef = this.firestore.collection(COLLECTIONS.MESSAGES);

... явно внутри конструктора после строки firebase.initializeApp. Когда TypeScript перемещается, он помещает эти строки перед инициализацией, которая не работает.

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