我正在try 创建一个事务,以便每次添加文档时,都会根据最新的计数更新计数.这似乎是两个世界中最好的,使用incrementgetCountFromServer,这样您只需按写入收费,而不必处理increment的痛苦和不一致.

这是一个添加新的待办事项,同时增加用户的待办事项计数的示例.

FireBase JS SDK

问题似乎是,getCountFromServer会回报一个promise

const userRef = doc(db, `users/${uid}`);

const todoRef = doc(collection(db, 'todos'));

const todoQuery = query(
    collection(db, 'todos'),
    where('uid', '==', uid)
);

await runTransaction(db, async (transaction) => {

    // Should be in transaction
    const todoCountDoc = await getCountFromServer(todoQuery);

    transaction.update(userRef, {
        todoCount: todoCountDoc.data().count + 1
    });
    transaction.set(todoRef, {
        uid,
        text,
        complete: false,
        created: serverTimestamp()
    });
});

我需要做的是将以下内容放入交易中:

const todoCountDoc = await getCountFromServer(todoQuery);

类似于:

// DOES NOT WORK
const todoCountDoc = await transaction.get(getCountFromServer(todoQuery));

我有一种感觉,这不是安全原因这不起作用,只是它没有在JS SDK中实现,因为没有人考虑过它.话又说回来,为什么create不是选项,而set是🤷🏼.我是不是遗漏了什么?

node JS

这在 node JS中似乎工作得很好,但我想在前端这样做:

const userRef = db.doc(`users/${uid}`);

const todoRef = db.collection('todos').doc();

const currentCount = db
    .collection('todos')
    .where('uid', '==', uid)
    .count();

db.runTransaction(async (transaction) => {

    const todoCountDoc = await transaction.get(currentCount);

    transaction.update(userRef, {
        todoCount: todoCountDoc.data().count + 1
    });
    transaction.create(todoRef, {
        uid,
        text,
        complete: false,
        created: FieldValue.serverTimestamp()
    });
});

我怎么才能在前台做到这一点?

J

推荐答案

FiRestore的客户端SDK仅支持事务内部的单个文档读取.无法将多文档读取(如查询)用作客户端事务的一部分,这包括计数和其他聚合操作(本质上总是考虑多个文档).

FiRestore的服务器端SDK使用悲观锁定,它允许在一个事务中使用多文档读取,因此也允许您在事务中使用计数查询.

但是,在客户端SDK中无法实现这种行为.因此,如果您的用例确实需要这样做,请考虑在服务器端实现它,然后从您的客户端调用它(例如,在Cloud Functions/Cloud Run中).

Javascript相关问答推荐

Express.js:使用Passport.js实现基于角色的身份验证时出现太多重定向问题

在JS中获取名字和姓氏的首字母

如何解决这个未能在响应上执行json:body stream已读问题?

有条件的悲剧

TypeScript索引签名模板限制

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

如何在ASP.NET中使用Google Charts API JavaScript将条形图标签显示为绝对值而不是负值

Reaction Redux&Quot;在派单错误中检测到状态Mutations

按下单键和多值

Phaser3 preFX addGlow不支持zoom

如何找到带有特定文本和测试ID的div?

在JS/TS中将复杂图形转换为数组或其他数据 struct

Cherrio JS返回父div的所有图像SRC

为什么我不能使用其同级元素调用和更新子元素?

为什么我的SoupRequest";被重置为初始值,以及如何修复它?

将以前缓存的 Select 器与querySelector()一起使用

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题

JSX/React -如何在组件props 中循环遍历数组

在每次重新加载页面时更改指针光标

元素类型无效:应为字符串(对于内置组件)或类/函数(对于复合组件),但GET:Object.在Reaction项目中