Облачные функции Firebase Cron Async Func Несколько вызовов - PullRequest
0 голосов
/ 30 января 2019

У меня есть функция облака.Он запускается заданием App Engine Cron.Он запускает мою облачную функцию Firebase каждый час с помощью Google Cloud Pub / Sub.Я получаю свою базу данных Firebase Realtime один раз и зацикливаюсь для каждого значения.Проблема в том, что моя функция main.async вызывается несколько раз.Я использую переменную i для цикла, и в моей консоли регистрируется больше, чем я считаю, длины моей базы данных.Я имею в виду, что если длина моей базы данных равна 4, но цикл for выполняется 8, 15 или 23 раза.Эти значения изменяются случайным образом.Я хочу выполнить цикл для каждого значения моей базы данных, получить некоторые данные в Интернете и, когда это будет сделано, перейти к следующему значению.Вот код:

use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var request = require('request-promise').defaults({ encoding: null });
var fs = require('fs');
// Get a reference to the Cloud Vision API component
const Vision = require('@google-cloud/vision');
const vision = new Vision.ImageAnnotatorClient();
var os = require("os");
var databaseArray = [];
var uniqueFilename = require('unique-filename')

exports.hourly_job = functions.pubsub
  .topic('hourly-job')
  .onPublish((event) => {
    console.log("Hourly Job");

    var db = admin.database();
    var ref = db.ref("myData")

   ref.once("value").then(function(allData) {

   allData.forEach(function(deviceToken) {

          deviceToken.forEach(function(firebaseIDs) {

        var deviceTokenVar = deviceToken.key;
        var firebaseIDVar = firebaseIDs.key;
        var firstvalue = firebaseIDs.child("firstvalue").val();
        var secondvalue = firebaseIDs.child("secondvalue").val();


        var items = [deviceTokenVar, firebaseIDVar, firstvalue, secondvalue];

        databaseArray.push(items);

});   

});
return databaseArray;
}).then(function (databasem) {

    main().catch(console.error);                
        });

return true;
});

const main = async () => {

    var i;
    for (i = 0; i < databaseArray.length; i++) {

        console.log("Database Arrays " + i + ". elements: ");

         if (databaseArrayfirst != "") {

        var apiUrl = "http://api.blabla;

        try {
        const apiBody = await request.get(apiUrl); 


    ///////////////////////////vison start//////////////////////    

        const visionResponseBody = await vision.documentTextDetection(apiBody)

         var visionResponse = visionResponseBody[0].textAnnotations[0].description;

         ...some logic here about response...

/////////////////////////////////////////////////   
         var getdatabasevar = await admin.database().ref("myData/" + databaseArrayDeviceToken + "/" + databaseArrayFirebaseID);

         await getdatabasevar.update({
         "firstvalue": visionResponse
         });  


/////////////////////////////////////////////////  

} catch (error) {
        console.error(error);
        }
///////////////////////////vison end//////////////////////  
    }

};
return true;
};

Спасибо.

...