我有一个可以编写文档的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);
});
答案 0 :(得分:0)
根据以下评论更新:
由于“当我们从移动设备或Web写入Firestore时会触发云功能”,因此您可以设置users/{user.id}/enquiries/{enquiryId.id}
文档的侦听器。
您只需要发送回user.id
和enquiryId.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);
}
});