实时数据库:快速创建然后删除节点

时间:2018-10-27 10:31:48

标签: javascript firebase firebase-realtime-database

我在创建节点时遇到问题,然后立即删除它。问题在于调用的顺序,因为我还具有云功能(侦听器),该功能在创建节点时将当前日期写入节点。因此,问题步骤如下:

  1. 用户在项目页面上点击书签按钮,然后应用程序将创建一个节点
  2. 已创建节点,并调用了云功能(侦听器)
  3. 用户点击书签btn将其清除,然后应用将删除该节点
  4. 节点已删除
  5. Cloud func在节点中写入当前日期(再次重新创建节点)

数据库监听器:

exports.BookmarkCreated = functions.database.ref(pathBookmark).onCreate(event => {

const userUid = event.params.userUid;
const bookmarkUid = event.params.bookmarkUid;
var p = [];
// set date created for bookmark
const date = new Date();
const dateCreated = date.getTime();
var p1 = admin.database().ref(ROOT_STUFF_BOOKMARKS +"/"+ userUid +"/"+ bookmarkUid).child("dateCreated").set(dateCreated);
p.push(p1);
// add bookmark to index
const bookmark = event.data.val();
var stuffKey = bookmark.stuffKey;
var p2 = admin.database().ref(INDEX_STUFF_BOOKMARKS +"/"+ stuffKey).child(userUid).set(bookmarkUid);
p.push(p2);
return Promise.all(p);
});

1 个答案:

答案 0 :(得分:1)

我可以想到三个主要选择。按照(个人)偏好的降序排列,这些是:

  1. 这听起来像您不希望该应用程序实际创建书签文档,而是希望它向数据库中写入“书签创建请求”。这将在单独的集合中,例如bookmark_creation_requests。然后,您的Cloud Function将在这些请求上触发,并创建实际的书签,其中包括所需的任何数据。这种方法在许多情况下非常普遍,例如,如果您要过滤聊天中的某些单词,则有一个pending_messages队列。

  2. 一种替代方法是确保仅在完全创建书签后才能将其删除。为此,您可以在启用 delete 按钮之前检查客户端中的al字段,还可以通过检查安全规则中所有字段的存在来实现。

  3. 最后的选择是使用一个事务将时间戳添加到书签文档,如果该文档不存在(不再),则中止该事务。