【发布时间】:2019-06-16 02:59:36
【问题描述】:
我为 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 的新手。这是我想做的:
- 为每个数据库数据获取
firstvalue。 - 使用每个数据库数据的第一个值发出 api 请求。
- Api 返回一张图片。
- 写入图像临时目录。
- 为 visionApi 处理此图像。
- 提取文本。
- 更新数据库。
- 为 deviceToken 发送通知
现在我可以在我的数组中检索数据库项目。当我在 for 循环中发出请求时,请求称为异步。所以for循环继续,但请求响应或写入文件和视觉处理只执行一次。
在for循环中,获取databasearray[0],发出请求,写入文件,使用vision 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;
});
【问题讨论】:
-
如果是我,我会切换到 TypeScript 并使用 Async/Await。那些 .then() 真的很糟糕
-
请解释你的答案。我该如何编写 TypeScript?我纯粹是新手:)
-
关注这个系列,很有用youtube.com/…
-
我会根据您的建议观看视频。但我不明白。很抱歉:(
-
刚刚发现js支持async/await。请阅读此blog.risingstack.com/mastering-async-await-in-nodejs
标签: node.js firebase firebase-realtime-database google-cloud-platform request