javascript - 实时数据库:快速创建然后删除节点
问题描述
我在创建节点时遇到问题,然后立即删除它。问题在于调用顺序,因为我还有云功能(监听器),它在创建节点时将当前日期写入节点。所以问题步骤如下:
- 用户点击项目页面中的书签按钮,然后应用程序将创建一个节点
- 已创建节点并调用云函数(侦听器)
- 用户点击书签 btn 将其清除,然后应用程序将删除该节点
- 节点被移除
- 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);
});
解决方案
我可以想到三个主要选项。按照(个人)偏好的降序排列,这些是:
听起来您不希望应用程序实际创建书签文档,而是让它向数据库写入“书签创建请求”。这将在一个单独的集合中,例如
bookmark_creation_requests
. 然后,您的云函数会在这些请求上触发,并创建包含任何所需数据的实际书签。这种方法在许多情况下都非常常见,例如,pending_messages
如果您想从聊天中过滤某些单词,则需要排队。另一种方法是确保书签只有在完全创建后才能删除。您可以通过在启用delete按钮之前检查客户端中的所有字段来执行此操作,还可以通过检查安全规则中是否存在所有字段来完成此操作。
最后的选择是使用事务将时间戳添加到书签文档,如果文档不存在(不再存在)则中止事务。
推荐阅读
- java - java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.media.MediaPlayer.start()”
- javascript - 在 Firefox 调试器上承诺返回后无法访问此上下文
- amazon-web-services - docker-machine create 命令出现“指定的区域无效”错误
- angular - 如何使用角度将一个组件的值共享到另一个组件
- android - 未来函数构建器之后的代码未执行
- macros - 气流默认变量 - 增量负载设置
- javascript - React:如何将数据传递给孩子
- javascript - 用对象反应减速器更新问题
- python - 按时间段的python数据框内部连接
- c# - MS Access 链接到 Sharepoint 列表添加新行而不是更新