Javascript Firebase更新数据库自动按键生成两次?

Javascript Firebase更新数据库自动按键生成两次?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我有一只很奇怪的虫子。我正在通过对引用调用update()更新firebase数据库引用。在调用update之前,我使用数据库引用上的push().key向firebase请求一个随机密钥。如下图所示 push().key 我有一个触发更新函数的按钮,它确实更新了我的引用,但出于某种奇怪的原因,尽管该按钮只触发了该函数一次(我记录了函数的调用,它只调用了一次),但它正在创建2个autoId键并复制数据库条目。正如我所说,按钮触发一次,但是引用被更新了两次。所以我有两个条目,而不是一个 这是我的

我有一只很奇怪的虫子。我正在通过对引用调用update()更新firebase数据库引用。在调用update之前,我使用数据库引用上的push().key向firebase请求一个随机密钥。如下图所示

push().key
我有一个触发更新函数的按钮,它确实更新了我的引用,但出于某种奇怪的原因,尽管该按钮只触发了该函数一次(我记录了函数的调用,它只调用了一次),但它正在创建2个autoId键并复制数据库条目。正如我所说,按钮触发一次,但是引用被更新了两次。所以我有两个条目,而不是一个

这是我的函数,当我的按钮被点击时被调用

function saveTimesheetEntry(weekNo, hours, payrate, type, theId) {

    console.log("Week Number: " + weekNo);
    console.log("Hours: " + hours);
    console.log("Pay Rate: " + payrate);

    var amount = hours * payrate;
    var vat = amount / 100 * 20; 

    console.log("Amount: " + amount);
    console.log("VAT: " + vat);
    console.log("Type: " + type);

    var autoId = contractorRef.push().key; // This is the generation of the key

    databaseRoot.ref('contractors-test/' + userObject.uid + '/timesheets-sub/weeks/'+weekNo).update({
        [autoId]:{ // Here I am using the generated key but its creating 2 separate entries in the db
            "hours":hours,
            "payRate":payrate,
            "amount":amount,
            "vat":vat,
            "type":type,
            "status":"submitted"
        }
    });

    databaseRoot.ref('contractors-test/' + userObject.uid + '/timesheets-sub/weeks').once('value', function(snapshot){

        $('#status-'+theId).removeClass("label-danger");
        $('#status-'+theId).addClass("label-warning");
        $('#status-'+theId).text("Submitted");
        $('#submitted-ts').html("");
        layoutSubTimeSheets(snapshot);

    });
}

如您所见,我向firebase请求一个autoId,然后将其用作我的密钥,但我使用上述对象得到了两个auto密钥,因此得到了两个数据库条目。

快速查看,这段代码似乎很好:每次运行函数时,应仅更新数据库一次。您使用的语法有点复杂-我会在调用
child()
时使用
autoId
,而不是在值中-但这不应该导致两个子项(事实上,它更可能导致值太少而不是太多)。你能在jsbin中重现这个问题吗,这样我就可以看一看了?你是否可能以某种方式双重注册了一个事件处理程序?我找到了答案。我确实让函数连续两次被调用@FrankvanPuffelen您是否建议将更新调用更改为databaseRoot.ref('contractors-test/'+userObject.uid+'/timesheets sub/weeks/'+weekNo+'/'+autoId),只在对象中包含值?也谢谢你的帮助!
update()
调用在传入的对象上循环。它为每个键设置您提供的值。因此,在您的情况下,
autoId
下的任何数据仍将被替换。如果这就是目的,那么您的代码就可以了。如果希望保留
autoId
下的现有属性,请确保在键中传递
autoId
,以便循环发生在树的较低位置。