为此花了一整天的时间。我真的很难使用Typescript和Firebase云函数。我想1(监控我的数据库的"购买"节点。当进行新的购买时,我想2(对用户的所有购买进行汇总,然后3(将其发送到我的CRM(sendinblue(。
我可以完成#1监控。我发现了#3如何将信息发送到我的CRM。这是我遇到麻烦的第二步。我不知道如何将.once
方法中的信息数组转换为单个值。我只想最后得到一个8.97这样的数字,发送到我的CRM(仅供参考,应该是1.99+2.99+3.99(。
我的数据库如下:
{
"1": {
"price": 1.99,
"product": "Product A",
"subscriptionExpiryDate": 1569445492
},
"2": {
"price": 2.99,
"product": "Product B",
"subscriptionExpiryDate": 1575556926
},
"3": {
"price": 3.99,
"product": "Product C",
"subscriptionExpiryDate": 1587990802
}
这是我的代码:
exports.purchaseTEST3 =
functions.database.ref('/users/{userID}/purchases').onUpdate((change: any, context: any) => {
const userRef = change.after.ref
let totalPurchases = 0
userRef.once("value")
.then(function(snapshot: any[]) {
snapshot.forEach(function(childSnapshot) {
const key = childSnapshot.key
const childData = childSnapshot.val()
totalPurchases = totalPurchases + childData
console.log('TEST3 info:', key, childData, totalPurchases)
// ^ gives "TEST3 info: 123 { price: 456 } 0[object Object][object Object]"
})
})
})
控制台日志如下所示:
TEST 3 info: 0[object Object][object Object][object Object] 3
所以我知道我得到了信息。我只是不知道如何解析它(或者不管这个词是什么(。
我是不是搞错了?我看了很多地方。
我对你的最终目标有点困惑。。。但我假设您希望从每个子节点访问每个单独的子节点(键、值或两者(。如果是这种情况,我会将每个子级的childData添加到foreach循环内的数组中。
在foreach循环之外,创建一个数组对象,然后在循环中,将childData添加到数组中。
exports.purchaseTEST3 =
functions.database.ref('/users/{userID}/purchases').onUpdate(async(change: any, context: any) => {
try{
const newArray: Array<string> = [];
let totalPurchases = 0
const CS = await userRef.once("value"); // this will wait for this function to resolve before continuing. CS will be a snapshot object
CS.forEach(function(childSnapshot) { // I do not use ForEach very often so this is untested syntax but the jist is there
const key = childSnapshot.key // this will be the master key, in this case 1, 2, or 3
const price = childSnapshot.child("price").val();
const product = childSnapshot.child("product").val();
const ExpireDate = childSnapshot.child("subscriptionExpiryDate").val();
newArray.push(product); // this will be the only thing accessible outside this forEach loop
totalPurchases = totalPurchases + price // You might have to convert price from a string to a number
console.log('TEST3 info:', key, product, price, ExpireDate, totalPurchases)
})
console.log("product 1: " newArray[0]);
console.log("product 2: " newArray[1]);
console.log("product 3: " newArray[2]);
...
}
catch(err){
console.log(err);
return err;
}
})
请注意,这是未经测试的,因此可能需要进行一些编辑,但一般的思考过程应该可以。
循环结束后,您可以访问阵列中的任何节点,前提是您知道这些节点的访问顺序。为了解决这个问题;OrderByChild";。
我也会考虑在你的云函数中使用异步和等待,而不是返回任务(.then(function….((。谷歌的typescript文档是缺乏的,但如果你想了解更多细节,请随时回复。我个人很喜欢这个来自Firebase峰会的youtube视频https://www.youtube.com/watch?v=tResEeK6P5I&t=1101s视频在18分钟标记之前与异步等待相关。
祝你好运!
编辑:
我认为我看到了这个问题,你需要在你的快照中更深入地挖掘另一个层次。正如您在示例中所写的,childData将是一个快照,其中包括一个新键和一个新值。试试这个:
const price = childSnapshot.child("price").val();
const product = childSnapshot.child("product").val();
const ExpDate = childSnapshot.child("subscriptionExpiryDate").val();
循环内部。我的其余评论仍然有效,但这应该会让你更深入。child的字符串参数需要与您的键完全匹配。我更新了上面的代码示例以反映这一变化。