0

J'utilise NodeJS comme back-end hébergé sur les fonctions Firebase pour interroger ma base de données firebase, j'ai ce code:interrogation de base de données Firebase prendre à beaucoup de temps dans Nuage Fonction

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
const cors = require('cors')({origin: true}); 
admin.initializeApp(functions.config().firebase); 
const express = require('express') 


exports.getAjax = functions.https.onRequest((request, response) => { 
    cors(request, response,() => { 
     console.log("request.body :", JSON.stringify(request.body)); 
     console.log("request.query :", JSON.stringify(request.query)); 


     var date = { 
      startDate: request.body.startDate, 
      endDate: request.body.endDate 
     } 
     var db = admin.database(); 
     var logsDbPath = 'logs'; 
     var usersDbPath = 'users'; 
     var ref = db.ref(logsDbPath); 
     var tags; 
     db.ref(usersDbPath).once('value').then(function(tagsSnapshot) { 
      tagsSnapshot.forEach(function(tagSnapshot) { 
      var tagId = tagSnapshot.key; 
      tagSnapshot.forEach(function(sessSnapshot) { 
       var userSessId = sessSnapshot.key; 
       var userInfo = sessSnapshot.val(); 
      }); 
      }); 

      tags = JSON.parse(JSON.stringify(tagsSnapshot.val())); 
      console.log(tags); 
     }); 
    }); 
}); 

Mon principal problème est que console.log(tags); et fait la finition de la requête et obtenir la valeur des balises a ~ 38 sec dans ce cas (parfois prend ~ 1 min), je mettrai l'image ci-dessous:

execution time

et cet objet, il est pas grand du tout, comme 100 rangées avec 4 p Roperties chacun, je ne pense pas que cela devrait prendre autant, probablement que j'ai fait quelque chose de mal, mais où?, je dois aussi écrire une promesse ou un rappel afin d'envoyer cette variable var réponse sur le front, provoquer la fonction finir avant d'avoir une valeur sur les tags (voir photo), je viens d'un arrière-plan PHP et ce concept javascript asynchrone est assez récent pour moi.

Répondre

2

Vous n'envoyez aucune réponse au client, ce qui signifie que la fonction continuera de fonctionner jusqu'à expiration du délai.

Pour vous assurer que la fonction ne fonctionne que pour aussi longtemps que nécessaire, envoyer une réponse au client lorsque vous avez chargé les données:

exports.getAjax = functions.https.onRequest((request, response) => { 
    cors(request, response,() => { 
    console.log("request.body :", JSON.stringify(request.body)); 
    console.log("request.query :", JSON.stringify(request.query)); 


    var date = { 
     startDate: request.body.startDate, 
     endDate: request.body.endDate 
    } 
    var db = admin.database(); 
    var logsDbPath = 'logs'; 
    var usersDbPath = 'users'; 
    var ref = db.ref(logsDbPath); 
    var tags; 
    db.ref(usersDbPath).once('value').then(function(tagsSnapshot) { 
     tagsSnapshot.forEach(function(tagSnapshot) { 
     var tagId = tagSnapshot.key; 
     tagSnapshot.forEach(function(sessSnapshot) { 
      var userSessId = sessSnapshot.key; 
      var userInfo = sessSnapshot.val(); 
     }); 
     }); 

     tags = JSON.parse(JSON.stringify(tagsSnapshot.val())); 
     console.log(tags); 

     // Send the response to the client, which also ends the function 
     response.status(200).send(tags); 
    }); 
    }); 
}); 

En dehors de cela, il est difficile de dire beaucoup. Gardez à l'esprit que Cloud Functions est en version bêta et change constamment, nous n'avons aucun moyen de savoir si c'est un démarrage à froid ou un démarrage à chaud, et nous ne pouvons pas voir votre projet pour inspecter ce qui se passe.

Si vous souhaitez avoir plus d'aide ici, je vous recommande d'essayer de reproduire le problème dans un environnement plus convivial. Par exemple, pouvez-vous reproduire le problème de performance avec un processus local node.js?

+0

Merci beaucoup pour votre réponse, c'est un grand honneur, j'apprécie vraiment firebase, tout le respect dû à toute votre équipe! Pour en revenir au code, j'ai eu le response.status (200) .send (JSON.stringify (tags)); à la fin mais mon erreur était je l'ai mis en dehors de la portée de la fonction, la fonction terminée et je n'ai aucun objet, mais en déplaçant la réponse envoyer à l'intérieur de la fonction a fonctionné, petite modification, pour une raison quelconque res.status (200) .send (étiquettes); mais j'ai changé avec response.status (200) .send (tags); et a travaillé, en ce qui concerne la vitesse de la requête semble maintenant bien, je vais le tester plus, merci! –

+1

Bonne prise sur la faute de frappe. J'ai mis à jour ma réponse pour y remédier. –