2017-12-24 28 views
0

を呼び出しを停止約束を返し、決してありません私はこのコードFirebaseクラウド機能は

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に行く、それは動作しますが、ページはロードを続け、私はログを見て、終了時に関数が呼び出され続けます。明らかに約束は適切に返されていないので、私はなぜそれがわからないのですか?

答えて

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

これはまだ問題を解決していません。この関数は呼び出しを続け、前と同じようにWebページのロードが完了することはありません。なぜこれが別の理由がありますか? – aoeuaoeu

+0

ああ、それはあなたが 'res'を使って返答することになっているからです。あなたが応答を送らないのでページはレンダリングされません。 – Callam

+0

ありがとうございました! – aoeuaoeu

関連する問題