首页 > 解决方案 > 实时数据库:快速创建然后删除节点

问题描述

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

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

标签: javascriptfirebasefirebase-realtime-database

解决方案


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

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

  2. 另一种方法是确保书签只有在完全创建后才能删除。您可以通过在启用delete按钮之前检查客户端中的所有字段来执行此操作,还可以通过检查安全规则中是否存在所有字段来完成此操作。

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


推荐阅读