调用firestore collection()不能在expo上工作

时间:2018-01-31 04:20:51

标签: reactjs firebase redux promise google-cloud-firestore

使用: React Native with expo

react-redux:5.0.6

redux:3.7.2

firebase:4.9.0

(见下面的修正:降级到firebase 4.6.2)

更新:这是一个较长的问题,基于怀疑redux与firebase不能很好地协作。但事实似乎并非如此。只保留相关部分

这是一个与redux连接的动作创建者。 在这里使用 String [] permissions1 = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; ActivityCompat.requestPermissions(MainActivity.this,permissions1,1); TimerTask task = new TimerTask() { @Override public void run() { Log.d(LOG_TAG,"request storage permission"); String [] permissions2 = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; ActivityCompat.requestPermissions(MainActivity.this,permissions2,2); } }; Timer timer = new Timer(); timer.schedule(task, 2000); 时,一切正常。

action.js

firebase.auth().signInWithEmailAndPassword()

但是当使用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()

可能是什么问题? 是否有特定的方式来传递收集路径? firebase配置可能不正确吗?我仔细检查了一切。我正在使用配置为Web应用程序。是否存在可能丢失的特定于firestore的内容?

我的firebase配置中有以下键:

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))
    }
};

2 个答案:

答案 0 :(得分:1)

不太确定你的代码中发生了什么,但是这种自我调用功能似乎有点不合适?重新格式化您的代码,使其对我自己更具可读性。

你可以看到你忘了在"结果" -block +上关闭}自我调用函数没有意义吗?当你已经有一个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是如何以及是否确实有效。

答案 1 :(得分:1)

好的,所以搜索了很多,发现这是一个与firestore无法使用世博会相关的问题! (更新了问题的标题以反映这一点)。

没有稳定的解决方法,但其他人已经面临这个问题,这里有一个解决方法,请检查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文件,现在情况正常。