如何从Firestore数据库返回值?

时间:2019-12-30 21:54:58

标签: javascript firebase google-cloud-firestore

我很难从Firestore数据库返回值。 我正在尝试从数据库中返回“金额”。 设置变量时,我可以console.log'amount'。 (请参见代码) 但是当我尝试在函数末尾返回值时,它不返回任何东西。('amount'未定义no-undef) 我如何返回该值。任何帮助都会很棒。请记住,我对这个话题还很陌生。

        import firebase from 'firebase/app';
        import 'firebase/firestore';
        import 'firebase/auth';

        export default function checkAmount() {

            let user = firebase.auth().currentUser;

            if (user) {
                let userUID = user.uid
                let docRef = firebase.firestore().collection("users").doc(userUID);

                docRef.get().then((doc) => {
                    if (doc.exists) {
                            let amount = doc.data().amount;
                            if (amount > 0){
                                console.log(amount) /// This does work
                            }
                        } else {
                            console.log("No such document!");
                        }
                    }).catch(function(error) {
                        console.log("Error getting document:", error);
                    });
            }

            return amount /// This **does not** return anything . How do i return the amount?
        }

1 个答案:

答案 0 :(得分:0)

原因是因为get()方法是异步的:它立即返回一个承诺,并在以后的一段时间内用查询结果解析 some get()方法不会阻塞该函数(如上所述,它会立即返回):这就是为什么最后一行(return amount)在异步工作完成之前执行,但是具有不确定的值。 / p>

您可以详细了解here和异步JavaScript方法,以及here了解为什么Firebase API是异步的。

因此,您需要等待get()返回的承诺得到解析,并使用Alex提到的then()方法来接收查询结果并发送响应。

以下将起作用:

    export default function checkAmount() {

        let user = firebase.auth().currentUser;

        if (user) {
            let userUID = user.uid
            let docRef = firebase.firestore().collection("users").doc(userUID);

            return docRef.get().then((doc) => {  //Note the return here
                if (doc.exists) {
                        let amount = doc.data().amount;
                        if (amount > 0){
                            console.log(amount) /// This does work
                            return true;  //Note the return here
                        }
                    } else {
                        console.log("No such document!");
                        //Handle this situation the way you want! E.g. return false or throw an error
                        return false;
                    }
                }).catch(error => {
                    console.log("Error getting document:", error);
                    //Handle this situation the way you want
                });
        } else {
           //Handle this situation the way you want
        }

    }

但是您需要注意,您的功能现在也异步了。因此,您应按以下方式调用它:

checkAmount().
then(result => {
  //Do whatever you want with the result value
  console.log(result);
})