2017-10-10 4 views
0

En cas de d'événement suivant .Une fois fonctionne très biensur l'événement de firebase ne fonctionne pas avec AWS lambda

'use strict'; 

let firebase = require('firebase'); 

exports.handler = function(event, context) 
{ 
    context.callbackWaitsForEmptyEventLoop = false; 
    firebase.initializeApp({ 
     serviceAccount: {}, 
     databaseURL: "https://harmanconnectedcar-180411.firebaseio.com/" 
    }); 

    firebase.database().ref('events').once('value').then(function(snapshot) { 
     console.log("*************event**********************") 
     console.log (snapshot.val()) ; 
     context.succeed() ; 
    }); 


     var starCountRef = firebase.database().ref('events'); 
starCountRef.on('value', function(snapshot) { 
    console.log("*************snapshot*****snapshot*****************") 
    console.log (snapshot.val()) ; 
    context.succeed(); 
}) 

}

Quand j'essaye starCountRef.on je ne suis pas en mesure de voir les journaux imprimés Une fois que j'ai mis la fonction lambda dans AWS et écrire dans Firebase à partir de la console Firebase, je ne peux pas voir les événements où dois-je voir les journaux comment vérifier l'événement starCountRef.on (je veux dire les journaux en temps réel)

Répondre

1

Vous démarrez deux écouteurs asynchrones. Puis, lorsque le premier d'entre eux se termine, vous appelez context.succeed(). À ce stade, Lambda termine votre fonction, de sorte que le second écouteur ne se termine jamais.

Pour que ce code fonctionne, vous devez vous assurer que vous n'appelez que context.succeed() lorsque toutes les données ont été chargées. Un moyen facile de le faire est à l'aide Promise.all():

exports.handler = function(event, context) 
{ 
    context.callbackWaitsForEmptyEventLoop = false; 
    firebase.initializeApp({ 
     serviceAccount: {}, 
     databaseURL: "https://harmanconnectedcar-180411.firebaseio.com/" 
    }); 


    var starCountRef = firebase.database().ref('events'); 

    var promises = []; 
    promises.push(firebase.database().ref('events').once('value')); 
    promises.push(starCountRef.once('value'); 

    Promises.all(promises).then(function(snapshots) { 
     snapshot.forEach(function(snapshot) { 
     console.log(snapshot.val(); 
     }); 
     context.succeed(); 
    }); 
} 
+0

juste enlevé context.succeed() dans le code ci-dessus qui fonctionne très bien mais la fonction de fonction Lambda a été expiré après 30 secondes je reçois comment je reste en direct pour toujours – DhanaLaxshmi

+0

Le 'context.succeed()' signale à Lambda que la fonction est fait avec son travail. C'est une partie cruciale de la course dans un environnement sans serveur/FaaS. Si vous ne voulez pas appeler 'context.succeed()', vous pouvez aussi vous éviter les tracas et exécuter un environnement Node.js standard. –

0

Vous semblez mélanger deux technologies ici.

La méthode onWrite est une construction de Cloud Functions for Firebase, qui (pour autant que je sache) ne peut pas être déployée sur Amazon lambda.

Si vous souhaitez accéder à votre base de données Firebase Realtime à partir d'Amazon Lambda, vous pouvez utiliser le Firebase Admin SDK. Mais cela n'inclut pas un moyen de déclencher votre code à chaque fois que la base de données est écrite.

+0

oui j'ai obtenu que s'il vous plaît vérifier la question mise à jour – DhanaLaxshmi

+0

Cela change radicalement la question, donc j'ai posté une réponse distincte. –