调用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数据