云功能实时数据库触发器中的未定义类型

问题描述 投票:0回答:2

我正在尝试开发一个云函数,它取一个金额的值,然后取总量并将金额加到该总金额上,然后用新金额重新写入总金额。

到目前为止,这就是我所拥有的:

    exports.newRequest = functions.database.ref("/aRef/{aUID}/{bUID}").onCreate((snapshot, context) =>{
    var requestSnapshot = snapshot.data;
    console.log('Testing stuff',  context.params.aUID);
    var UID= context.params.aUID;
    var thisAmount= requestSnapshot.child('amount').val();
    var totalAmount= functions.database.child('aRef').child('bRef').child(UID).child('totalAmount').val();
    var finalAmount = totalAmount+ thisAmount;
    return functions.database().ref(`aRef/bRef/${UID}/totalAmount`).set(finalAmount);

});

这是我得到的错误:

TypeError: Cannot read property 'Id' of undefined
    at exports.newRequest.functions.database.ref.onWrite.context (/user_code/index.js:14:44)
    at cloudFunctionNewSignature (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:114:23)
    at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:144:20)
    at /var/tmp/worker/worker.js:827:24
    at process._tickDomainCallback (internal/process/next_tick.js:135:7)

我理解错误导致我进入第14行,在这种情况下试图获得{Id}的值,但不明白如何纠正它?

javascript firebase google-cloud-functions
2个回答
0
投票

你的功能定义很远。它应该接受第一个参数,它是一个快照,第二个参数是一个上下文。你现在所拥有的看起来似乎正试图将两个对象组合成一个名为context的参数。

您可能希望返回the documentation并了解数据库onWrite触发器的工作原理。


0
投票

所以经过一段时间的挖掘和Doug Stevenson的领导后,我错误地调用/尝试从上下文而不是快照中获取数据并尝试从我的数据库的另一个区域获取数据而不放入.once()。 ()以检索快照。我也不需要onWrite方法,而是onCreate方法。

以下是需要它的人的最终代码。

exports.onRequest = functions.database.ref("/Donations/{UID}").onCreate((snapshot, context) =>{
        var requestSnapshot = snapshot.val();
        var ID = snapshot.child('toid').val();    
        var thisAmount = snapshot.child('amount').val();
        var database = admin.database().ref(`/users/charity/${ID}/acc/totalAmount`);
        return database.once('value').then (snapshot =>{
        var totalAmount = snapshot.val();
        var finalAmount = totalAmount + thisAmount; 
         console.log('status',  snapshot.child('amount').val());
        return database.set(finalAmount); 

        });
        });
© www.soinside.com 2019 - 2024. All rights reserved.