调用firestore collection()在博览会上不起作用

Posted

技术标签:

【中文标题】调用firestore collection()在博览会上不起作用【英文标题】:Call to firestore collection() not working on expo 【发布时间】:2018-07-10 02:33:26 【问题描述】:

使用: 用 expo 反应原生

react-redux: 5.0.6

redux:3.7.2

火力基地:4.9.0

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

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

这是一个与 redux 挂钩的动作创建器。 在此处使用firebase.auth().signInWithEmailAndPassword() 时,一切正常。

action.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

【问题讨论】:

如果您在 dataFetch 中登录了 querySnapshot,您会得到什么? 实际上,在.get() 之后的执行似乎根本不在.then() 内部。是因为指定收集路径的方式吗?无法记录 querySnapshot。 我只是在参数中使用名称'MyCollection'。也试过'/MyCollection',还是不行。 仔细检查了我的 firebase 配置,一切正常。如何确认我连接到正确的数据库?我知道,这听起来很基础,但我觉得我没有正确连接到数据库。不知道我错过了什么。 请检查dataFetch是否被调用,在函数的第一行添加日志语句 【参考方案1】:

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

对此没有稳定的解决方案,但其他人也遇到了这个问题,这里有一个解决方法,请查看 Igor 的回答: In react native app (through Expo) using firestore permissions - request.auth is always null

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

希望它能尽快进入官方版本。

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

【讨论】:

【参考方案2】:

不太清楚您的代码中发生了什么,但自调用函数似乎有点不合适?重新格式化您的代码,使其对我自己更具可读性。

如您所见,您忘记在“结果”块上使用 结束 + 自调用函数没有意义?既然已经有一个 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 如何以及是否真的有效。

【讨论】:

我的代码只是写同一件事的另一种方式。语法错误是在 SO 中编写时出现的。无论如何,我已经使它简洁明了。并尝试了你的版本。还是不行。 signInWithEmailAndPassword 有效。 如果我记录const request = firebase.firestore().collection('MyCollection').get() 的结果,我会得到一个对象"_40":0,"_65":0,"_55":null,"_72":null。不知道这是从哪里来的。

以上是关于调用firestore collection()在博览会上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Firestore / Cloud功能 - 如何在更改时更新Firestore数据

使用带有 Firestore 的 collection.add() 应用程序崩溃

Firestore 获取数据时性能缓慢的问题

firestore onSnapshot 执行两次

按照Firestore中的文档顺序进行定位[复制]

在 Firebase Firestore 中注册时设置文档 ID