【问题标题】:Deleting a record from Firebase by ID按 ID 从 Firebase 中删除记录
【发布时间】:2017-04-02 09:56:18
【问题描述】:

我正在尝试根据记录的 ID 从我的 FireBase 数据库中删除记录,但没有删除记录。
我已经阅读了诸如 How to delete/remove nodes on Firebaseremove-item-from-firebase 之类的 SO 帖子,但我无法解决我的问题。

数据库的结构是:

my_project  
|  
|-messages  
 |+Kg87....  
 |+Kg9a....  
 |+and so on...  

我的代码:

const firebaseConfig = {
    apiKey: "AIza....",
    authDomain: ".firebaseapp.com",
    databaseURL: "https://myProject.firebaseio.com",
    storageBucket: "myproject.appspot.com",
    messagingSenderId: ""
};

firebase.initializeApp(firebaseConfig);
exports.delete =
functions.database.ref('/messages/{pushId}/text')
    .onWrite(event => { 
        var db = firebase.database();
        var ref = db.ref("messages");
        //console.log(ref.child("-Kg9a...").toJSON()); //- OK prints https://myproject.firebaseio.com/messages/Kg9a...
        ref.child("-KgOASNRfF2PheKQ6Yfu").remove();  //Does nothing, returns promise - pending
    });

据我了解,ref 是对 messages 节点的引用,因此 ref.child("Kg9a....") 是对所需子节点的引用。

  • 我没有收到任何错误,但没有任何反应。记录保留在数据库中。
  • 如果我将最后一行更改为 console.log(ref.child("Kg9a....").remove());,我会看到日志显示 Promise { <pending> },但即使几个小时后也没有任何反应。

  • 这不是安全规则问题 - 我已将我的安全规则设置为 ".read": true, ".write": true 并且它仍然不会删除记录。

  • 我的 firebase 版本是 3.5.0 - 我已经安装了 3.7.1,但是当我运行 firebase -V 时,我发现版本是 3.5.0
    有什么建议吗?

【问题讨论】:

  • 您能否添加您正在使用的实际代码?一个 jsFiddle 的例子会很棒。
  • @adolfosrs - 我已经添加了完整的代码。我正在从 firebase 的控制台运行它。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

进行一些更改以使其正常工作。我假设您确实想删除触发事件的记录,而不是示例中的文字字符串 ID。你需要返回你从 remove() 中得到的承诺,尽管我发现即使有一个 then() 处理程序也可以工作,但由于返回它是根据需要记录的,我通常两者都做。 Promise 就像结果/返回码,通常不会被忽略。

var someId = '-KgOASNRfF2PheKQ6Yfu';
exports.delete =
    functions.database.ref('/messages/{pushId}/text')
        .onWrite(event => {
          if (!event.data.exists()) return;
          var ref = event.data.adminRef.root.child('/messages').child(someId);
          return ref.remove().then(function(){
            console.log('OK, gone');
          }).catch(function(e){
            console.log('OOPS, problem: ' + e.message);
          })
        });

【讨论】:

  • 不,我想删除给定 ID 的特定记录。我的最终目标是从数据库中删除旧消息。
  • 此 onWrite 处理程序将在对任何记录的每次更改时运行。你怎么知道你要删除的记录的id?您甚至会被要求删除您要删除的那个。无论如何,只需将该 id 放在第二个 chile() 方法调用中。我将编辑答案以说明。
  • 嗯,它有效。所以问题出在我试图引用我的记录的方式上。我想知道为什么ref = event.data.adminRef.root.child('/messages').child(someId); 有效,而firebase.database().ref("messages").child(someId); 无效。
  • 不确定这是否是问题,但在 Firebase 云功能中,我使用以下内容初始化管理 api:firebase.initializeApp(functions.config().firebase); 但在您的情况下,您可以使用事件中的引用。
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 2021-11-12
相关资源
最近更新 更多