【问题标题】:Firebase Update resultset NodeJSFirebase 更新结果集 NodeJS
【发布时间】: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.transaction returns a promise,因此它应该与其他承诺很好地配合使用(例如在Promise.all() 调用中)。
  • 对不起,我对术语的使用不好。 ref.once“值,函数(快照)”我认为是“承诺”;它是一个在返回快照结果后调用的代码块。它表明,无论我在“forEach”中做什么,如果满足条件,我都无法更新返回的对象数组中的数据并让它在数据库中更新

标签: node.js firebase-realtime-database nosql firebase-admin


【解决方案1】:

Frank 给出了最好的回答:

Firebase 数据库事务是比较和设置的。将立即调用回调,并使用客户端对当前值的最佳猜测。通常这将是空的。您告诉它新值将基于什么,最终将再次调用您的回调,并更新对当前值的猜测。请参阅 stackoverflow.com/questions/33578887/... – Frank van Puffelen 2018 年 11 月 21 日 16:21

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 2022-01-19
    • 1970-01-01
    • 2023-03-17
    • 2022-08-16
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多