【问题标题】:React Native - upload image to Firebase using @react-native-firebase/storage - No Firebase App '[DEFAULT]' has been createdReact Native - 使用 @react-native-firebase/storage 将图像上传到 Firebase - 没有创建 Firebase 应用“[DEFAULT]”
【发布时间】:2020-04-10 14:29:44
【问题描述】:

将图片上传到 Firebase 时出现以下错误:

错误:没有创建 Firebase 应用“[DEFAULT]” - 调用 firebase.initializeApp()

这是我的代码:

  1. App.js

    import * as Firebase from 'firebase';
    
    componentDidMount() {
        Firebase.initializeApp(firebaseConfig);
    }
    
  2. Profile.js

    import * as Firebase from 'firebase';
    import rnFb from '@react-native-firebase/storage';
    
    uploadImage = localUri =>
    new Promise((resolve, reject) => {
        const localUri2 = Platform.OS === 'ios' ? localUri.replace('file://', '') : localUri;
        const fbUri = Firebase.storage().ref();
        rnFb().ref(localUri2).putFile(fbUri)
        .then(
            () => { resolve(); }
        )
        .catch(
            (e) => { reject(e); }
        );
    });
    

.putFile 行失败。

我不明白问题出在哪里,因为我在App.js 中调用.initializeApp()

更新 12/21 我在rnFb().ref(localUri2).putFile(fbUri) 之前添加了console.log(Firebase.apps.length);,输出为1...确实很奇怪。

...如果我完全按照错误的要求执行并在rnFb().ref(localUri2).putFile(fbUri) 之前调用firebase.initializeApp(),我会收到错误错误:

Firebase: Firebase App named '[DEFAULT]' already exists

救命!!

【问题讨论】:

  • 在你的代码中加入一些调试日志。是先调用 initializeApp 吗?
  • 是的,确实是首先调用它
  • 请提供您正在使用的 RN 和 RN Firebase 版本。初始化应用程序的推荐方法是为 Android 提供 google-services.json 文件,为 iOS 提供 GoogleService-Info.plist 文件。还要确保您在 Firebase 控制台上启用了 Storage API。
  • "react-native": "0.61.5", "@react-native-firebase/storage": "^6.0.4",

标签: firebase react-native firebase-storage react-native-firebase


【解决方案1】:

您是否遵循 API 文档?我似乎在文档中找不到您需要手动调用initializeApp()

【讨论】:

    【解决方案2】:

    我的理解是@react-native-firebase内部使用的Firebase SDK独立于firebase的普通Firebase SDK。

    它可以使用:

    import firebase from '@react-native-firebase/app';
    // OR
    import { firebase } from '@react-native-firebase/storage';
    

    应用这些更改(并简化您的代码),您将获得以下结果:

    import storage, { firebase } from '@react-native-firebase/storage';
    
    // can possibly be somewhere else
    firebase.initializeApp(firebaseConfig);
    
    uploadImage = localUri => {
      const localUri2 = Platform.OS === 'ios' ? localUri.replace('file://', '') : localUri;
      return storage().ref('/path/to/upload/to').putFile(localUri2)
    }
    

    除了使用"client initialization"使用firebase.initializeApp(),还可以使用“原生初始化” 对于AndroidiOS

    【讨论】:

    • 如果可以的话,有 2 个问题。 (1) 你是说我需要运行 firebase.initializeApp() 两次......一次用于@react-native-firebase/storage,第二次用于常规 firebase(数据库和身份验证)? (2) 如何获取字符串'上传到的路径'
    • 1) 您根本不应该使用原生 Firebase SDK。使用@react-native-firebase 加载的同一个 Firebase SDK。 2) /path/to/upload/to 只是一个占位符,用于存储您想要保存文件的任何位置。假设这些是个人资料图片,您可以将图片保存为profile-pics/someUserId.png。文件的名称和存储位置由您决定。
    • 我将原生 Firebase SDK 用于实时数据库并在我的整个应用程序中进行身份验证。如果我放弃使用 @react-native-firebase SDK 的原生 Firebase SDK.......我需要重写所有代码吗?
    • @jamesmurphy 不,它应该只是在您使用 import * as Firebase from 'firebase';import { firebase } from '@react-native-firebase/app'; 的任何地方之间进行单线交换 - 尽管您可能需要将 Firebase 更改为firebase 或使用 { firebase: Firebase }。避免@react-native-firebase/database 有什么特别的原因吗?我会认为将所有内容移植到可观察对象会是有益的?
    • 我明白你的意思。你看到@adrianpascu 的答案了吗?他提出了一个有效的观点,即文档中没有任何地方说您需要手动调用`initializeApp()。当所有选项(即 api 密钥等)都在 google-services.json 文件中时,我确实觉得您需要调用此函数很奇怪。
    【解决方案3】:

    我认为您的fbUri 是错误的。参数必须是一个字符串。 例如:

        firebase
              .storage()
              .ref('remote_path') // remote path where you want to store
              .putFile(
                'local/ok.jpeg' // local file
              )
              .then(successCb)
              .catch(failureCb);
    

    【讨论】:

    • 不幸的是不起作用....我在 fbUri 上运行 toString() 方法以获取完整路径....但仍然是同样的错误
    • @jamesmurphy toString() 不是正确的方法。您必须获取文件的本地路径。
    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 2022-10-18
    • 2023-03-31
    • 2021-06-07
    • 2021-09-28
    • 2018-01-14
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多