我看到了几个有关此问题的主题,但有时只是因为很少的错误而已。
对我来说,这仍然是一个实际问题,我的经验很少:
const addRoom = functions.region('europe-west1').https.onCall((data, context) => {
console.log("a")
return Promise.resolve();
});
没有Promise.resolve()的相同结果:
const addRoom = functions.region('europe-west1').https.onCall((data, context) => {
console.log("a")
});
(当然,我在客户端只调用了一次函数)
我创建了一个Web应用程序,并进行了一些测试:来自云函数的538个调用,但不应超过100个。。。我简直不敢相信这些统计信息,这是不可能的。这是一个严重的问题。
该怎么办?
答案 0 :(得分:2)
我要如何处理这个问题是在Firestore中创建一个记录eventIds
的集合,然后在每次使用要幂等的云函数时进行检查。
//Check if exists in event log
async function isIdempotenceOk(eventId) {
console.log(eventId);
let eventDoc = await
admin.firestore().collection('events').doc(eventId).get();
if (eventDoc.exists) {
console.log('Event already processed');
return false;
} else {
await admin.firestore().collection('events').doc(eventId).set({ eventId: eventId });
return true;
}
}
然后您可以像这样在其他函数中调用它:
const addRoom = functions.region('europe-west1').https.onCall((data, context) => {
console.log("a")
if(!await isIdempotenceOk(context.eventId)){return null;}
console.log('ok to continue')
return Promise.resolve();
});
这确实意味着您在Firestore中有一个集合,该集合会针对您执行此检查的每个函数调用,并且可能存在另一种方式来存储要检查的eventIds
。