如何使用 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个回答
您的云函数通过写入数据库来触发。无法直接从该函数向客户端返回值,因为此代码与客户端之间没有直接连接。
您有两个选择:
- 将其更改为 可调用云函数 ,然后执行对数据库的写入并返回值。
- 将结果写入数据库,并让客户端等待。
后者可以通过设置云函数写入的
responses/{requestId
集合/文档来完成。而且由于文档 ID 与请求 ID 相同,因此客户端可以等待该文档被写入。
您还可以根据
requestId
将
mail
集合中的文档 ID 作为基础,在这种情况下,客户端也可以等待该文档显示出来:
return admin.firestore().collection('mail').doc(context.params.requestId).set(...)
Frank van Puffelen
2020-04-05