调用 firestore collection() 不适用于世博会

IT技术 reactjs firebase redux promise google-cloud-firestore
2021-05-26 03:37:14

使用:React Native with expo

react-redux:5.0.6

还原:3.7.2

火力基地:4.9.0

(请参阅下面的修复:降级到 firebase 4.6.2)

更新:这是一个更长的问题,因为有人怀疑 redux 不能很好地与 firebase 配合使用。但情况似乎并非如此。只保留相关部分

这是一个与 redux 相关的动作创建者。firebase.auth().signInWithEmailAndPassword()这里使用时,一切正常。

动作.js

import firebase from 'firebase'
import 'firebase/firestore'

export const dataFetch = () => {
    return (dispatch) => {
        firebase.auth().signInWithEmailAndPassword('a@b.com', 'passw')      
        .then(
            (result => dispatch({ type: 'DATA_FETCH_SUCCESS', payload: result })),
            (() => alert("got here"))
        )
        .catch((err) => alert(err))
    }
};

但是在使用时firebase.firestore().collection(...).get(),执行不会进入部件内部then()- 无法在其中记录任何内容。

import firebase from 'firebase'
import 'firebase/firestore'

export const dataFetch = () => {
    return (dispatch) => {
        firebase.firestore().collection('MyCollection').get()
        .then(
            (result => dispatch({ type: 'DATA_FETCH_SUCCESS', payload: result })),
            (() => alert("got here"))
        )
        .catch((err) => alert(err))
    }
};

可能是什么问题?有没有具体的方法来传递收集路径?firebase 配置可能不正确吗?我仔细检查了一切,看起来是正确的。我正在使用 Web 应用程序的配置。是否有特定于 firestore 的东西可能会丢失?

我的 firebase 配置中有以下键:

apiKey: '',           // Auth / General use
authDomain: '',       // Auth with popup/redirect
databaseURL: '',      // Realtime Database
storageBucket: '',    // Storage
messagingSenderId: '',// Cloud Messaging
projectId: '',        // Firestore
2个回答

好的,搜了一圈,发现是firestore不支持expo的问题!(更新了问题的标题以反映这一点)。

对此没有稳定的解决方案,但其他人遇到了这个问题,这里有一个解决方法,请检查 Igor 的回答: 在使用 firestore 权限的本机应用程序(通过 Expo)中 - request.auth 始终为空

该问题在 React Native 中并已在此处讨论:https : //github.com/firebase/firebase-js-sdk/issues/283#issuecomment-345815579

希望它能尽快进入正式版本。

仅供参考,我降级到 firebase 4.6.2 并替换了上面链接中提到的 index.js 文件,现在一切正常。

不太确定您的代码中发生了什么,但是那个自调用函数似乎有点不合适?重新格式化您的代码,使其对我更易读。

如您所见,您忘记在“结果”块上使用 } 关闭 + 自调用函数没有意义?当您已经有一个 catch 块时,为什么还要尝试在那里捕获错误?

export const dataFetch = () => {
return (dispatch) => {
    firebase.firestore().collection('MyCollection').get()
    .then((result => {
            dispatch({ type: 'DATA_FETCH_SUCCESS', payload: result }),
            (() => { alert("got here"); })
    )
    .catch((err) => {
        alert(err);
    });
};
};

无论哪种方式,这都应该有效:

export function dataFetch (){
  const request = firebase.firestore().collection(`MyCollection`).get()
  return (dispatch) => {
    return request.then((result) => {
         dispatch({ type: 'DATA_FETCH_SUCCESS', payload: result})
    }).catch((error)=> {
           console.log({error})
    })
  }
}

不确定您的 signInWithEmailAndPassword 如何以及是否真的有效。