我正在将我的 Google Cloud 函数从 v1 迁移到 v2,并发现在一些情况下 Cloud Function gen2 具有上一代功能的子集 - 与 eventarc 相关。
例如,在我的 v1 代码中,我可以获取调用用户。
exports.onMyUpdate = functions
.region('europe-west1')
.database
.ref('/my/{myId}')
.onUpdate(async (change, context) => {
const user = context.auth ? context.auth.uid : SYSTEM;
const isUpdatedBySystem = user === this.SYSTEM;
...
const abort = isUpdatedBySystem ? true : false;
if (abort) {
logger.info("Update by system - Exit");
return Promise.resolve(true);
}
...
但据我所知,在 gen2 函数中,eventarc 不提供此信息。
onValueUpdated(
{
region: "us-central1",
ref: "/my/{myId}",
},
async (event) => {
该事件仅包含以下数据:
{
"time": "2024-10-15T10:43:07.285Z",
"ref": "my/1234",
"source": "//firebasedatabase.googleapis.com/projects/_/locations/us-central1/instances/my-qa",
"id": "1234567890=",
"instance": "my-qa",
"type": "google.firebase.database.ref.v1.updated",
"subject": "refs/my/1234",
"specversion": "1.0",
"location": "us-central1",
"data":
{
"before":
{...},
"after":
{...}
},
"traceparent": "00-1234567890-1234567890-01",
"firebaseDatabaseHost": "firebaseio.com",
"params":
{}
}
不幸的是,我没有找到任何关于事件的预期以及如何处理 eventarc 和之前的 gen1 触发器之间的差异的文档。
我的问题是:
我是否需要重写整个前端(和后端)以在每次调用数据库(添加/更新)时写入 invokerId,或者是否有其他方法在 v2 函数(eventarc)中获取调用者?
这是实时数据库触发器的示例(第一代):
exports.onMyUpdate = functions
.region('europe-west1')
.database
.ref('/my/{myId}')
.onUpdate(async (change, context) => {
const user = context.auth ? context.auth.uid : SYSTEM;
const isUpdatedBySystem = user === this.SYSTEM;
...
const abort = isUpdatedBySystem ? true : false;
if (abort) {
logger.info("Update by system - Exit");
return Promise.resolve(true);
}
...
用于实时数据库触发器(第二代)。在您的函数源中,您必须导入您要使用的 SDK 模块。
// The Cloud Functions for Firebase SDK to setup triggers and logging.
const { onValueUpdated } = require('firebase-functions/v2/database');
const { logger } = require('firebase-functions');
exports.onMyUpdate = onValueUpdated('/my/{myId}', (event) => {
const user = event.auth ? event.auth.uid : SYSTEM;
const isUpdatedBySystem = user === SYSTEM;
if (isUpdatedBySystem) {
logger.info("Update by system - Exit");
return;
}
...
注意:这只是一个示例,请根据需要修改代码。