聆听功能内的更新

时间:2019-08-02 23:47:30

标签: javascript firebase google-cloud-firestore google-cloud-functions

我有一个可以编写文档的https onRequest云函数。该文档触发了另一个云功能,该功能会基于计算向该文档添加一个字段。

有没有建议如何使https onRequest函数的结果等待添加该字段并使用该字段的值响应https?

exports = module.exports = functions.https.onRequest(async (req, res) => {

    const user = await admin.firestore().collection("users").doc();

    const enquiryId = await admin.firestore().collection("users").doc(user.id).collection("enquiries").doc();

     await enquiryId.set({
       value: req.query.value;
    });

    let getQ = functions.firestore.document('users/{user.id}/enquiries/{enquiryId.id}').onUpdate((change, context) => {
      const newValue = change.after.data();
      q = newValue.quote;
      return q
    });

    getQ;
    return res.status(200).send(getQ);
});

1 个答案:

答案 0 :(得分:0)

根据以下评论更新:

由于“当我们从移动设备或Web写入Firestore时会触发云功能”,因此您可以设置users/{user.id}/enquiries/{enquiryId.id}文档的侦听器。

您只需要发送回user.idenquiryId.id的值作为对HTTP Cloud Function的响应,如下所示:

    await enquiryDocRef.set(data);
    return res.status(200).send({userDocID : user.id, enquiryDocId: enquiryId.id});

,然后使用这两个值来设置侦听器。该文档位于此处:https://firebase.google.com/docs/firestore/query-data/listen

这样,当到达注释中所述的第4步时,即“基于计算,[users/{user.id}/enquiries/{enquiryId.id})文档中的字段被更新”时,您的监听器将被触发,并且您将得到更新前端的字段值。


初始答案:

如果您想让HTTP Cloud Function“等到添加该字段并用该字段的值响应https”,则只需等待异步set()操作完成后再发送返回响应。

set()方法返回的Promise解析时,您可以检测到该操作已完成。

因为您await enquiryId.set({...}) 因此非常接近解决方案await将使Cloud Function等待Promise结算(不再挂起),因此您只需要在此行之后立即返回响应,如下所示:

因此只需执行以下操作:

exports = module.exports = functions.https.onRequest(async (req, res) => {

    try {
        const userDocRef = await admin.firestore().collection("users").doc();
        const enquiryDocRef = await admin.firestore().collection("users").doc(userDocRef.id).collection("enquiries").doc();

        const data = {
            value: req.query.value
        };

        await enquiryDocRef.set(data);
        return res.status(200).send(data);
    } catch (error) {
        return res.status(400).send(error);
    }

});
相关问题