我试图根据记录的ID从我的FireBase数据库中删除记录,但记录没有被删除。
我已经阅读了How to delete/remove nodes on Firebase,remove-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> }
,但即使在几个小时后也没有任何反应。
这不是安全规则问题 - 我已将我的安全规则设置为&#34; .read&#34;:true,&#34; .write&#34;:是的,它仍然是不会删除记录。
3.5.0
- 我已安装3.7.1
,但当我运行firebase -V
时,我认为版本为3.5.0
。答案 0 :(得分: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);
})
});