Firebase云函数中用ExpressJS查询并更新指定Firestore文档
解决Firebase Cloud Functions中查询Firestore并更新文档的问题
问题分析
你的代码存在两个核心问题:
get()是异步方法,直接赋值会得到Promise而非实际查询结果,无法直接调用data()where查询返回的是QuerySnapshot(可能包含多个匹配文档),不是单个DocumentSnapshot,不能直接使用data()方法
修正后的代码
// 包裹在async函数中处理异步逻辑 exports.handleStripeWebhook = functions.https.onRequest(async (req, res) => { try { // 从Stripe Webhook获取email(根据实际Webhook结构调整路径) const email = req.body.data.object.email; // 异步执行查询,等待结果返回 const querySnapshot = await db.collection('ConnectedAccounts') .where('email', '==', email) .get(); // 判断是否有匹配的文档 if (querySnapshot.empty) { console.log('未找到匹配email的文档'); return res.status(404).send('未找到对应文档'); } // 遍历匹配文档并添加新字段(若email唯一,可直接用querySnapshot.docs[0]取第一个) querySnapshot.forEach(async (doc) => { // 更新文档,添加新字段(示例为添加Stripe账户ID和更新时间) await doc.ref.update({ stripeLinkedId: req.body.data.object.id, linkedAt: admin.firestore.FieldValue.serverTimestamp() }); console.log('文档更新成功:', doc.id); }); res.status(200).send('处理完成'); } catch (error) { console.error('处理失败:', error); res.status(500).send('服务器错误'); } });
关键说明
- 必须用
await等待get()方法执行完成,确保拿到实际的查询结果集合 - 通过
querySnapshot.empty判断是否存在匹配文档 - 使用
doc.ref.update()更新文档,不存在的字段会自动创建 - 若
email在集合中是唯一标识,可直接通过querySnapshot.docs[0]获取目标文档,无需遍历
内容的提问来源于stack exchange,提问作者MALIK forz
相关产品推荐
相关产品推荐

