2017-06-09 3 views
0

Firebase-REST-Endpunkt. Ich bekomme eine Menge von NULL zurück, besonders beim Start. Wenn ich andere Themen durchschaue, denke ich, dass es ein Coldstart ist. Ich glaube, das Problem ist, dass ich Callbacks verwende, die zurückgeben, bevor Firebase die Chance hat, ein Dataset zurückzugeben. Ich habe einen Kommentar über Callbacks von @puf - frank-van-puffelen gelesen einen Kaltstart. Also versuche ich als Versprechen zu schreiben. Dieser Code funktioniert in der Regel, aber immer noch die Kaltstart NULL-Datensätze. Wie würde ich das als Versprechen tun?Firebase-Funktionen Endpunkt Kaltstart

var functions = require('firebase-functions'); 
 
const admin = require('firebase-admin'); 
 
admin.initializeApp(functions.config().firebase); 
 

 
//================================================================================================= 
 
// KeysFromAccountGet01 
 
//================================================================================================= 
 
// This function is not working correctly because it often returns a NULL set. probably 
 
// because I am using callbacks instead of promises, and the callback returns before firebase 
 
// can return a query. Usually it works. 
 
// But I am fairly sure that I should be using PROMICES so as to wait for the data to arrive. 
 
// that said, I can not figure out how to do a promise. Everythign I have tried returns nothing. 
 
// some sugestions on how to do promises for this would be appreciated. 
 
//curl 'https://us-central1-test.cloudfunctions.net/KeysFromAccountGet01?account=dporras8' 
 
//curl 'https://us-central1-test.cloudfunctions.net/KeysFromAccountGet01?account=' 
 
//firebase deploy --only functions:KeysFromAccountGet01 
 
exports.KeysFromAccountGet01 = functions.https.onRequest((req, res) =>{ 
 
    var arr =[]; 
 
    arr.push("1====+++starting"); 
 
    arr.push("acount = "+ req.query.account); 
 
admin.database().ref('/newacctok/'+req.query.account+'/tok3/').on('value', function(snapshot){ 
 
     snapshot.forEach(function(miniSnapShot){ 
 
     var tt = miniSnapShot.val(); 
 
      var json = ({ 
 
        "key":miniSnapShot.key, 
 
        "account":req.query.account, 
 
        "uuid":tt.uuid, 
 
        "ts2":tt.ts2, 
 
        "token":tt.token 
 
      }); 
 
     arr.push(json); 
 
}) 
 
    .then(res.status(200).send(arr)); 
 
}); 
 

 
//===================================

+0

Versprechen machen keinen Unterschied für das Verhalten. Sie machen den Code einfacher lesbar, wenn Sie mehrere verschachtelte Lasten haben. Welches Problem hast du, wenn du das 'send (...)' in den Callback verschiebst? –

+0

Und tun Sie definitiv, was Bob sagt: Verwenden Sie ein 'once()'. Es gibt keinen Nutzen für einen kontinuierlichen Listener in einer HTTP-Funktion. –

+0

Hast du es gelöst? –

Antwort

1

Ich bin diese Änderungen mit Ihrer Null zurückkehrt nicht sicher helfen. Beachten Sie, dass ich on() geändert habe, wodurch der Listener an once() angeschlossen bleibt. Außerdem habe ich Antworten von Frank van Puffelen gesehen, die davor warnen, eine asynchrone Verarbeitung in HTTPS-Anforderungsfunktionen durchzuführen. Ich werde versuchen, seine Antworten/Kommentare zu finden und sie hinzuzufügen.

exports.KeysFromAccountGet01 = functions.https.onRequest((req, res) => { 
    var arr =[]; 
    arr.push("1====+++starting"); 
    arr.push("acount = "+ req.query.account); 
    // note change from on() to once() 
    admin.database().ref('/newacctok/'+req.query.account+'/tok3/').once('value') 
    .then(snapshot => { 
     snapshot.forEach(miniSnapShot => { 
     var tt = miniSnapShot.val(); 
     var json = ({ 
      "key":miniSnapShot.key, 
      "account":req.query.account, 
      "uuid":tt.uuid, 
      "ts2":tt.ts2, 
      "token":tt.token 
     }); 
     arr.push(json); 
     }); 
     res.status(200).send(arr) 
    }); 
});