首页 > 解决方案 > 如何使用 Firebase 函数和 Firestore 返回承诺?

问题描述

当用户提出请求时,firestore正在使用其各自的数据创建文档。文档的创建会触发firebase function然后将电子邮件发送到特定地址。它工作正常,但是当此电子邮件已发送/未发送时,我如何从函数中获得返回成功/错误警报(客户端)的承诺。

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();

exports.request = functions.firestore.document('requests/{requestId}').onCreate(async (snapshot, context) => {
  const itemDataSnap = await snapshot.ref.get();
  const name = itemDataSnap?.data()?.name ? itemDataSnap?.data()?.name : 'Unbekannt';
  const email = itemDataSnap?.data()?.email;
  const products = itemDataSnap?.data()?.products ? itemDataSnap?.data()?.products : 'Fehler: Keine Produkte vorhanden';

  return admin.firestore().collection('mail').add({
    to: [...],
    from: [email],
    message: {
      subject: ...,
      html: ...
    }
  }).then(() => console.log('Queued email for delivery!'))
});

如您所见,到目前为止,我正在记录'Queued email for delivery!'Firebase 控制台的成功消息 -但是我怎样才能将它带到客户端(给用户)

标签: angulartypescriptfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


您的云函数是通过写入数据库来触发的。无法从那里直接向客户端返回值,因为此代码与客户端之间没有直接连接。

你有两个选择:

  1. 将此更改为可调用的 Cloud Function,然后执行写入数据库并返回值。
  2. 将结果写入数据库,让客户端等待。

例如,后者可以通过设置responses/{requestId}云函数写入的集合/文档来完成。并且由于文档 ID 与请求 ID 相同,因此客户端可以等待该文档被写入。

mail您还可以将集合中的文档 ID基于requestId,在这种情况下,客户端也可以等待该文档显示:

return admin.firestore().collection('mail').doc(context.params.requestId).set(...)

推荐阅读