【问题标题】:Firebase Cloud Functions not returning Promise and never stop callingFirebase Cloud Functions 不返回 Promise 并且永远不会停止调用
【发布时间】:2017-12-24 13:38:35
【问题描述】:

我有这个代码

const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

const ref = admin.database().ref()


    exports.updateActiveUsers = functions.https.onRequest((req, res) => {
                console.log("updateActiveUsers Called")

                const currentTime = new Date().getTime()
                const startDate = currentTime - 432000000
                var allPromises = []
             return ref.child('users').orderByChild('lastOnline').once('value').then(snap =>{

                    snap.forEach(childSnap => {
                        console.log(childSnap.val().userID)
                        if (childSnap.val().lastOnline > startDate){
                            const ref2 = ref.child("activeUsers/" +  childSnap.val().userID).set(true)
                            allPromises.push(ref2)
                        }else{
                            const ref2 = ref.child("activeUsers/" +  childSnap.val().userID).remove()
                            allPromises.push(ref2)
                        }

                    })
                    console.log("promises: " + allPromises)
                    return Promise.all(allPromises)

                })
            })

我似乎无法让它返回或结束函数。我转到它在上传时提供的http url,它可以工作,但是页面不断加载并且我查看日志,并且该函数在完成后继续被调用。显然 Promise 没有正确返回,我不知道为什么!

【问题讨论】:

    标签: node.js firebase google-cloud-functions


    【解决方案1】:

    您可以一次更新所有更改,而不是单独推送每个用户的更改。

    const admin = require('firebase-admin');
    const functions = require('firebase-functions');
    
    admin.initializeApp(functions.config().firebase);
    
    const usersRef = admin.database().ref('users');
    const lastOnlineQuery = usersRef.orderByChild('lastOnline');
    
    exports.updateActiveUsers = functions.https.onRequest((req, res) => {
    
      const currentTime = new Date().getTime();
      const startDate = currentTime - 432000000;
    
      let values = {};
      let activeCount = 0;
    
      return lastOnlineQuery.once('value').then(snapshot => {
        snapshot.forEach(child => {
          let { lastOnline, userID } = child.val();
          let value = lastOnline > startDate || null;
          values[`activeUsers/${userID}`] = value;
          activeCount += value;
        });
        return admin.database().ref().update(values);
      }).then(() => {
        res.send(`Active users: ${activeCount}`);
      }).catch(error => {
        res.status(500);
        res.send(error);
      });
    });
    

    【讨论】:

    • 嗯,这仍然没有解决问题。该函数不断调用,网页永远不会像以前一样完成加载。会不会有其他原因?
    • 啊,这是因为您应该使用 res 返回响应——页面永远不会呈现,因为您没有发送响应。
    • 非常感谢!
    猜你喜欢
    • 2012-08-19
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多