【问题标题】:change.after.val() returns full JSON object rather than value of the objectchange.after.val() 返回完整的 JSON 对象而不是对象的值
【发布时间】:2018-05-11 04:21:27
【问题描述】:

我正在开发 Firebase 云功能。当我记录 change.after.val() 的值时,我得到一个键值对的打印输出

{ DCBPUTBPT5haNaMvMZRNEpOAWXf3: 'https://m.youtube.com/watch?v=t-7mQhSZRgM' }

而不仅仅是值(URL)。这是我的代码。我对 .val() 不了解什么? “更新”不应该只包含 URL 吗?

exports.fanOutLink = functions.database.ref('/userLink').onWrite((change, context) => {

const updated = change.after.val();
console.log(updated);

return null

});

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    如果您只需要 URL 值,则应在 URL 键的触发路径中包含通配符:

    exports.fanOutLink = functions.database.ref('/userLink/{keyId}').onWrite((change, context) => {
      console.log('keyId=', context.params.keyId);
    
      const updated = change.after.val();
      console.log(updated);
    
      return null
    });
    

    在实时数据库中,数据为modeled as a JSON tree。事件触发器中指定的路径标识树中的一个节点。节点的值,即 JSON,包括所有子节点。触发事件的change参数是指整个节点的值。

    我在上面指出,您可以将触发路径更改为向下引用一级。另一种方法是使用DataSnapshotchild() 方法访问节点的子节点。

    在不了解您的用例的情况下,很难更具体地了解您应该使用的触发事件路径。请记住,当节点值的任何元素发生更改时会触发该事件,无论是根级别的简单值还是子节点的值。通常情况下,您希望触发器尽可能具体,以便更好地识别发生了什么变化。这就是路径中的通配符有用的地方。正如我在发布的代码中所示,通配符的字符串值可从 context 参数中获得。

    【讨论】:

    • 非常感谢。我隐约明白为什么会这样,但你能解释一下为什么吗?
    • @luciusdegeer:我更新了我的答案以提供更多解释。
    • 如何访问 change.after.val() 中对象的值???如果我执行 cont valueOfKey = change.after.val().status 我得到一个错误。
    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2011-11-25
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多