2017-04-02 83 views
0

我想从我的FireBase数据库中删除记录,基于记录的ID,但记录没有被删除。
我读过SO帖子,如How to delete/remove nodes on Firebase,remove-item-from-firebase和更多,但我无法解决我的问题。删除从Firebase的记录ID

数据库的结构是:

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
    有什么建议吗?
+0

你可以添加你使用的实际代码吗?一个jsFiddle的例子会很棒。 – adolfosrs

+0

@adolfosrs - 我已添加完整的代码。我从Firebase的控制台运行它。 – TDG

回答

1

一些改变,以获得工作。我假设你真的想要删除触发事件的记录,而不是你的例子中的文字字符串ID。你需要返回你从remove()得到的承诺,虽然我发现即使有一个then()处理程序也可以工作,但是由于返回它是根据需要记录的,所以我通常都会这样做。承诺就像结果/返回码,通常不会被忽略。

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); 
      }) 
     }); 
+0

不,我想删除给定ID的特定记录。我的最终目标是从数据库中删除旧的消息。 – TDG

+0

这个onWrite处理程序将对每条记录的更改运行。你如何知道要删除的记录的ID?你甚至会被叫去找你正在删除的那个。在任何情况下,只需将该id放入第二个chile()方法调用中即可。我将编辑答案来说明。 – Mike

+0

嗯,它的工作原理。所以问题就在于我试图引用我的记录。我想知道为什么'ref = event.data.adminRef.root.child('/ messages')。child(someId);'起作用,而firebase.database()。ref(“messages”)。child (someId);'不。 – TDG