React Native - 使用@react-native-firebase/storage上传图像到Firebase - 未创建Firebase应用程序“[DEFAULT]”

4
上传图像到 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(),我会得到错误信息:Error:

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

求助!!


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

1
我的理解是,@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)
}

除了使用firebase.initializeApp()进行"客户端初始化"之外,您还可以使用“本地初始化”来进行AndroidiOS


我有两个问题。 (1) 你是说我需要运行firebase.initializeApp()两次...一次是为了@react-native-firebase/storage,另一次是为了常规的firebase(数据库和身份验证)吗?(2) 我该如何获取字符串“上传路径”? - james murphy
  1. 你不应该使用原生的Firebase SDK。请使用由@react-native-firebase加载的相同Firebase SDK。
  2. /path/to/upload/to只是一个占位符,用于指定您想要保存文件的存储位置。假设这些是个人资料图片,您可以将图像保存为profile-pics/someUserId.png。您可以自行决定文件名称和存储位置。
- samthecodingman
我在我的应用程序中使用原生Firebase SDK进行实时数据库和身份验证。如果我放弃原生Firebase SDK,转而使用@react-native-firebase SDK......那么我需要重写所有的代码吗? - james murphy
@jamesmurphy 不,它应该只是一个单行交换,你需要在使用 import * as Firebase from 'firebase'; 的任何地方将其替换为 import { firebase } from '@react-native-firebase/app'; - 尽管你可能需要将 Firebase 更改为 firebase 或使用 { firebase: Firebase }。避免使用 @react-native-firebase/database 有特别的原因吗?我认为将所有内容移植到 observables 上会很有益。 - samthecodingman
1
我理解你的观点。你看到了@adrianpascu的答案吗?他提出了一个有效的观点,即文档中没有任何地方说明需要手动调用initializeApp()。我确实觉得很奇怪,因为所有选项(即API密钥等)都在google-services.json文件中,为什么还需要调用这个函数。 - james murphy
我在我的答案中也涉及到了这一点,尽管我略过了它,假设你已经尝试过了。你是否尝试按照那些说明去操作,看看是否有遗漏的地方? - samthecodingman

1

您是否遵循了API文档?我在文档中找不到需要手动调用initializeApp()的任何地方。


-1

我认为你的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()方法以获取完整路径...但仍然出现相同的错误。 - james murphy
@jamesmurphy toString() 不是正确的方法。你必须获取文件的本地路径。 - tuledev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接