开发者问题收集

从 onFinalize Firebase 云函数获取返回值

2021-07-25
257

我创建了一个解压 onFinalize 函数,它可以解压复制到存储中的任何文件,然后删除该文件,这个函数运行良好,但是我想从 onFinalize 云函数返回到我的 Angular 应用程序,或者以某种方式监听以了解何时完成该过程。

现在我使用日志记录,但是它很烦人,因为对 logger api 的 rest 调用使用 accessToken,并且在 3600 秒内过期后不可能刷新 accessToken (只有当用户注销并再次登录时才会再次计数)

无论如何,在 Angular 中有没有没有 rest 调用或没有访问令牌的好的解决方案?

export const manageZipArchives = functions
  .region("xxxxx")
  .runWith({timeoutSeconds: 540, memory: "512MB"})
  .storage.bucket("xxxxxxxxx")
  .object()
  .onFinalize(async (obj: functions.storage.ObjectMetadata) => {
    const file = admin
      .storage()
      .bucket(obj.bucket)
      .file(obj.name!);

    ...

    return ok;
  });
1个回答

It's very strange, that I can't listening, or get return from function (from your comments)

由 Cloud Storage 事件触发的 Cloud Functions 是 后台 Cloud Functions。它们没有任何客户端(或前端)的概念:在 Cloud Storage 中创建的文件可能是由后端进程创建的,例如在 Compute Engine 实例上运行的应用。

对于您而言,您可以利用 Firestore 实时数据库 提供的实时监听器。

我们以 Firestore 文档为例。该过程如下:

在您的 Angular 应用中:

  1. 使用 doc() 方法在特定集合中生成文档引用。
  2. 使用 id 属性获取与此引用对应的文档 ID。
  3. 将此文档 ID 分配为 自定义元数据 文件上传。
  4. 使用 onSnapshot() 方法为此文档引用设置一个监听器。该文档尚不存在,但这不是问题:创建文档时将触发监听器。
  5. 上传文件

在您的 Cloud Function 中:

  1. 当解压、删除等所有异步工作完成后,获取存储为自定义元数据值的文档 ID 值并在 Firestore 中创建文档 =>角度应用中的侦听器将被触发,您知道此文件的工作已完成。

请注意,如果您想向前端报告潜在错误或异常,您也可以使用 Firestore 文档:例如,您可以添加一个 status 字段和一个 errorMessage 字段,其中包含所需的信息。在侦听器中,您将获得这些字段的值。

Renaud Tarnec
2021-07-25