Google Cloud 函数 v2 eventarc - 获取调用用户

问题描述 投票:0回答:1

我正在将我的 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)中获取调用者?

google-cloud-platform firebase-realtime-database google-cloud-functions
1个回答
0
投票

这是实时数据库触发器的示例(第一代):

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;
  }
...

注意:这只是一个示例,请根据需要修改代码。

© www.soinside.com 2019 - 2024. All rights reserved.