【发布时间】:2019-04-24 05:17:55
【问题描述】:
为什么我似乎无法更新结果集。我有 1000 个项目,我查询 Firebase 并取回一个 DataSnapShot 数组。我想检查数组的每个元素,如果存在条件,则将“类型”更改为“C”。我没有收到任何错误,但似乎没有应用更新。我在返回的承诺中执行此操作,但更新被“忽略”。
var db = admin.database();
var ref = db.ref("/calendars");
ref.once("value", function(snapshot) {
snapshot.forEach(function(data) {
var obj = data.val();
if (someconditionIsTrue) {
var objToUpdate = `calendars\\${data.key}`;
console.log(`Should update ${objToUpdate}`);
var entryRef = db.ref("/calendars").child(data.key).child('type');
entryRef.transaction(function(t) {
console.log(`TYPE: ${t}`); // DISPLAYS NULL EVEN THOUGH THERE IS A CHAR IN DB
return "C"; // Should change TYPE in the record to a "C"
});
}
还尝试在 forEach 中很好地进行设置,但这也不起作用(这就是为什么我认为我必须使用事务)。
【问题讨论】:
-
Firebase 数据库事务是比较和设置的。将立即调用回调,并使用客户端对当前值的最佳猜测。这通常是
null。您告诉它新值将基于什么,最终将再次调用您的回调,并使用对当前值的更新猜测。见stackoverflow.com/questions/33578887/… -
您要检查的情况是什么?
-
条件并不真正相关(取出条件并进行更新,无论如何 - 它不会更新)。在承诺中我似乎无法更新记录?
-
我在您分享的代码中看不到任何承诺。但是
Reference.transactionreturns a promise,因此它应该与其他承诺很好地配合使用(例如在Promise.all()调用中)。 -
对不起,我对术语的使用不好。 ref.once“值,函数(快照)”我认为是“承诺”;它是一个在返回快照结果后调用的代码块。它表明,无论我在“forEach”中做什么,如果满足条件,我都无法更新返回的对象数组中的数据并让它在数据库中更新
标签: node.js firebase-realtime-database nosql firebase-admin