Firebase数据库按订单云功能获得所有价值

时间:2019-01-22 15:38:09

标签: node.js firebase firebase-realtime-database google-cloud-platform request

我为Firebase Cloud Functions开发。我有一个像这样的Firebase实时数据库:

----- myData 
      -------eqewrwrepere (this one is a device token)
                         ---------Lta+sde-fer (this one is a firebase id)
                                  firstvalue  : "a"
                                  secondvalue : "b"

                        ----------Qrgd+ad-qdda (this one is second firebase id)
                                  firstvalue  : "c"
                                  secondvalue : "d"

      -------eqwerSAsdqe (this one is another device token)
                        ---------Lta+sde-fer (this one is a firebase id)
                                 firstvalue  : "x"
                                 secondvalue : "y"

                       ----------Qrgd+ad-qdda (this one is second firebase id)
                                 firstvalue  : "z"
                                 secondvalue : "t"

我通过这段代码获取这些数据。通过此代码,我获取了所有数据并将它们放入数组。当获取完成时,我循环使用此数组查找项目。我是iOS开发人员,所以我是NodeJS的新手。这是我想做的:

  1. 为每个数据库数据获取firstvalue
  2. 使用每个数据库数据的firstvalue进行api请求。
  3. Api返回图像。
  4. 写入图像临时目录。
  5. 处理此图像以获取visionApi。
  6. 提取文字。
  7. 更新数据库。
  8. 发送关于deviceToken的通知

现在,我能够检索阵列中的数据库项目。当我在for循环中发出请求时,该请求称为异步。因此for循环继续进行,但是请求响应或写入文件和视觉处理仅执行一次。

在for循环中,获取databasearray [0],发出请求,写入文件,使用视觉api处理它,更新数据库并转到下一个databasearray [1]项目。

我在不同页面上读到了Promises。但是我不明白。

谢谢。

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var request = require('request');
var fs = require('fs');
//var fs = require("fs");
// Get a reference to the Cloud Vision API component
const Vision = require('@google-cloud/vision');
const vision = new Vision.ImageAnnotatorClient();
// Imports the Google Cloud client library
//const {Storage} = require('@google-cloud/storage');
var fs = require("fs");
var os = require("os");
var databaseArray = [];


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) {

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

            var databaseArrayDeviceToken = databaseArray[i][0];
            console.log("DeviceToken: " + databaseArrayDeviceToken);

            var databaseArrayFirebaseID = databaseArray[i][1];
            console.log("FirebaseID: " + databaseArrayFirebaseID);

            var databaseArrayfirstvalue = databaseArray[i][2];
            console.log("firstval: " + databaseArrayfirstvalue);

            var databaseArraysecondval = databaseArray[i][3];
            console.log("Second: " + databaseArraysecondval);


            var url = "http://api.blabla" + databaseArrayfirstvalue;

            /////////////here make a request, pause loop, process returned image, but how //////////////////////         
            request.get({
                    url: url,
                    encoding: 'binary'
                }, function(error, httpResponse, body) {


                    if (!error && httpResponse.statusCode == 200) {

                        fs.writeFileSync('/tmp/processed.jpg', body, 'binary')
                        console.log("file written");
                    })

            }

        });

        return true;
    });

1 个答案:

答案 0 :(得分:1)

我发现Mocas帮助解决方案。这是解决方案。我在代码中使用异步/等待功能。现在for循环等待函数响应。但是现在我有不同的问题。我认为主要的异步功能由于等待而挂起。然后下一个小时触发,它将再次运行。因此控制台日志会在for循环中显示15-16-17或更多的“ i”值。我在数据库阵列中有4个元素,但控制台日志每小时显示的次数更多。而且每次都增加。所以我想我应该在超时后取消此等待功能。但是我不知道如何。这是代码:

    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]);
            //console.log(databaseArray);   
    //return true;
    });   
    //return true;
    });
    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: ");


            var databaseArrayDeviceToken = databaseArray[i][0];
            console.log("DeviceToken: " + databaseArrayDeviceToken);

            var databaseArrayFirebaseID = databaseArray[i][1];
            console.log("FirebaseID: " + databaseArrayFirebaseID);

            var databaseArrayfirst = databaseArray[i][2];
            console.log("first: " + databaseArrayfirst);

            var databaseArraysecond = databaseArray[i][3];
            console.log("second: " + databaseArraysecond);



             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;

             console.log("Vision response text " + visionResponse );

             ...some logic here about response...

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

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


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

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

             await getanotgerdatabasevar.once("value")
              .then(function(var) {

              ..some logic..


              //send notification


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


        }

    };
    return true;
    };