代码之家  ›  专栏  ›  技术社区  ›  lucius degeer

改变之后val()返回完整的JSON对象,而不是对象的值

  •  1
  • lucius degeer  · 技术社区  · 6 年前

    我正在研究Firebase云函数。当我记录更改值时。之后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
    
    });
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Bob Snyder    6 年前

    如果只需要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参数引用整个节点的值。

    我在上面指出,您可以更改触发器路径以向下引用一级。另一种方法是使用 child() 方法 DataSnapshot

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