Firebase云函数多次执行

Firebase云函数多次执行,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,我看到了一些关于这个问题的话题,但有时只是因为一些错误 这对我来说仍然是一个真正的问题,我没有多少经验: const addRoom = functions.region('europe-west1').https.onCall((data, context) => { console.log("a") return Promise.resolve(); }); 没有承诺的相同结果。resolve(): (当然,我只在客户端调用该函数一次) 我创建了一个web应用程序

我看到了一些关于这个问题的话题,但有时只是因为一些错误

这对我来说仍然是一个真正的问题,我没有多少经验:

const addRoom = functions.region('europe-west1').https.onCall((data, context) => {
    console.log("a")
    return Promise.resolve();
});

没有承诺的相同结果。resolve():

(当然,我只在客户端调用该函数一次)

我创建了一个web应用程序,并做了一些测试:538个来自云功能的调用,但不应超过100个。。。我简直不敢相信这些统计数字,这是不可能的。这是一个严重的问题


该怎么办?

我如何处理这个问题是在Firestore中创建一个集合,记录
事件ID
,然后每次使用我想成为幂等函数的云函数时检查这个集合

//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(data.eventId)){return null;}
console.log('ok to continue')
return Promise.resolve();
});

这意味着您在Firestore中有一个集合,它为您执行此检查的每个函数调用,并且您可能有另一种方法来存储要检查的
EventID

这是和上的Firebase文档。“HTTP函数最多调用一次。”对此不确定…实现了类似的功能,并认为值得注意:请注意,如果您有两个不同的云函数监视同一firestore路径,您的检查将在您可能不需要的时候退出。属性“eventId”不存在于类型“CallableContext”上此解决方案似乎可以工作,但是我发现类型
CallableContext
上不存在属性
eventId
CallableContext
的TS定义没有将
eventId
定义为属性。您是对的,您必须使用
EventContext
从某处调用,因此在上面的示例中,您必须通过
data
将其传入。我使用它的地方是用于
onCreate
例如:
exports.addRoom=functions.firestore.document('rooms/{roomId}').onCreate(async(snap,context)=>{if(!wait-isidempotensok(context.eventId)){return null;}//continue}
const addRoom = functions.region('europe-west1').https.onCall((data, context) => {
console.log("a")

if(!await isIdempotenceOk(data.eventId)){return null;}
console.log('ok to continue')
return Promise.resolve();
});