开发者问题收集

如何使用 Firebase 函数和 Firestore 返回承诺?

2020-04-05
63

当用户提交请求时,将创建一个包含相应数据的 firestore 文档。此文档创建会触发 firebase 函数 ,然后该函数会将电子邮件发送到特定地址。它运行正常,但是 当此电子邮件已发送/未发送时,如何从函数中获得返回成功/错误警报(客户端)的承诺。

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!'))
});

如您所见,到目前为止,我将 '排队等待发送的电子邮件!' 作为 firebase 控制台的成功消息记录下来 - 但我如何将其带到客户端(给用户)

1个回答

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

您有两个选择:

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

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

您还可以根据 requestIdmail 集合中的文档 ID 作为基础,在这种情况下,客户端也可以等待该文档显示出来:

return admin.firestore().collection('mail').doc(context.params.requestId).set(...)
Frank van Puffelen
2020-04-05