我正在尝试通过Firestore事务创建分布式计数器。我有一个帖子集合,每个帖子都有一个子集“count_shards”。每个文档都包含三个文档(1,2,3),其中包含“计数”字段。
当我为帖子创建“喜欢”文档时,我想选择一个随机文档并将其递增1.我有以下的Typescript代码:
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
exports.addShard = functions.firestore
.document(`likes/{docID}`)
.onCreate(async (snap, context) => {
const postID: string = snap.data().postID;
const randNum: number = (Math.floor(Math.random()*3+1));
const postRef = admin.firestore().doc(`post/${postID}/count_shards/${randNum}`);
admin.firestore().runTransaction(async transaction => {
const postShard = (await transaction.get(postRef)).data();
postShard.count += 1;
return transaction.update(postRef, postShard);
});
});
我收到以下错误消息:
“错误:/Users//firecast/functions/src/index.ts[13,9]:必须妥善处理承诺”
“函数@ lint:tslint --project tsconfig.json
”
任何人都知道我在这里做错了什么?
runTransaction
返回一个承诺。你需要await
它。
await admin.firestore().runTransaction(...);
runTransaction
方法返回Promise
。正如this blog post所说:你必须归还那个Promise
。
这些很重要:
...如果您希望函数在异步工作期间保持活动状态,您可以通过从函数返回一个promise来实现此目的(HTTP / S触发器除外,它需要向客户端发送响应)。
或者换句话说:如果你没有返回那个Promise
,你的功能可以在没有完成transaction
的情况下完成。
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
exports.addShard = functions.firestore
.document(`likes/{docID}`)
.onCreate(async (snap, context) => {
const postID: string = snap.data().postID;
const randNum: number = (Math.floor(Math.random()*3+1));
const postRef = admin.firestore().doc(`post/${postID}/count_shards/${randNum}`);
return admin.firestore().runTransaction(async transaction => {
const postShard = (await transaction.get(postRef)).data();
postShard.count += 1;
return transaction.update(postRef, postShard);
});
});