【问题标题】:Update last child in Firebase list更新 Firebase 列表中的最后一个孩子
【发布时间】:2019-02-23 04:04:28
【问题描述】:

Firebase JS SDK 中的文档有点晦涩,但据我所知,如果我想更新列表的最后一项,我必须像这样引用列表并链接更新?

const { uid } = await firebase.auth().currentUser;

const ref = firebase
    .app()
    .database()
    .ref();

const userRef = ref
    .child('users/' + uid + '/myList')
    .orderByKey()
    .limitToLast(1)
    .update({ stamp: Date.now() });

但没有骰子。

// TypeError: ref.child(...).orderByKey(...).limitToLast(...).update is not a function

更新:

我可以清楚地看到我的 ref 的正确 toString 值,但值是不存在的?

const { uid } = await firebase.auth().currentUser;

const ref = firebase
    .database()
    .ref('users/' + uid)
    .child('myList');

console.log(ref.toString()); // firebaseio.com/users/XtNjKhhF...lfBn2/myList

ref.on('value', function(snap) {
    console.log('snap val', snap.val()); // never called
});

// data is clearly there, no?
{
  "users" : {
    "Xt....lfABn2" : {
      "myList" : {
        "-LZDd5G2lhNv5ogv" : {
          "start" : 1550728848450
        }
      }
    }
  }
}

【问题讨论】:

  • “没有骰子”是什么意思?这里有什么问题?
  • 最后的评论让我哈哈大笑。我不认为@DougStevenson 实际上是在问 No Dice 是什么意思——他问的是我们的实际问题。问题中的错误消息非常清楚: .update 不是该调用的函数,因此您正在调用不存在的东西。该文档提供了几个关于如何更新字段的具体示例 - 请查看 Update Specific Fields。通读并更新您的代码,使其包含合法的 API 调用,并让我们知道您遇到的问题。
  • 谢谢@Jay,是的,我认为 TypeError 就足够了,“为什么会出现类型错误,有人知道正确的方法吗?” ;)。如果没有先前对创建的对象的引用,我在文档中看不到任何执行此类操作的内容。我认为它很清楚我想要做什么,对吧?但是,缺少的上下文可能是我正在尝试进行独立操作,而以前没有引用列表中的内容。我只知道该列表存在并且只想更新最后一项。谢谢您的帮助。完全卡在这里,我知道我做错了。
  • 使用 firebase,如果您想更新任何需要 a) 明确知道节点的“路径”,或 b) 通过观察或查询检索该路径。因此,对于 a) 如果您想更新帖子列表中的最后一篇帖子,var lastPost = firebase.database().ref('posts').limitToLast(1); - 该帖子将在快照中返回,因此您知道密钥,然后可以通过 ref 更新您想要的任何子值节点。所以底线是您需要更新 ref,而不是从查询返回的快照。有意义吗?

标签: javascript firebase


【解决方案1】:

此代码返回一个快照,但您将其视为参考

const userRef = ref
    .child('users/' + uid + '/myList')
    .orderByKey()
    .limitToLast(1)

您不能在快照上执行 update()

  .update({ stamp: Date.now() });

这就是为什么您需要在快照中添加.ref

const userRef = ref
    .child('users/' + uid + '/myList')
    .orderByKey()
    .limitToLast(1)
    .ref                            // <- this line here
    .update({ stamp: Date.now() });

【讨论】:

  • 没有错误,只是默默地做它的事情并且数据库没有更新。
  • 您能否检查一下是否将戳记作为新孩子添加到父级?我们可能需要在更新之前传递子名称
猜你喜欢
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
相关资源
最近更新 更多