Firebase云函数报错TypeError: db.transaction is not a function求解决
解决Firebase云函数中
TypeError: db.transaction is not a function错误 嘿,我来帮你搞定这个问题!你碰到的这个错误,核心原因是Firebase Admin SDK的Firestore事务方法名称用错了——正确的方法是runTransaction,而不是你代码里写的transaction,这是个很容易混淆的API细节。
问题根源
在Firebase Admin SDK中,Firestore实例并没有名为transaction的方法,执行事务需要调用runTransaction方法,它接收一个事务处理函数作为参数,和你原本的代码逻辑适配,只是方法名要改。
修正后的完整代码
我帮你把代码修正并补全了未完成的评分聚合逻辑(比如计算总评分、平均评分,还有处理目标文档不存在的情况):
const admin = require('firebase-admin'); const functions = require('firebase-functions'); admin.initializeApp(); const db = admin.firestore(); exports.aggregateRatings = functions.firestore .document('destinations/{destId}/reviews/{reviewId}') .onWrite(event => { // 注意:如果是Firebase云函数v2版本,参数应该是(change, context),这里适配你原代码的event写法 const reviewRating = event.data?.get('reviewRating'); if (!reviewRating) { // 如果没有评分数据,直接返回,避免无效计算 return Promise.resolve(); } const destinationId = event.params.destId; const destRef = db.collection('destinations').doc(destinationId); // 替换db.transaction为db.runTransaction return db.runTransaction(transaction => { return transaction.get(destRef).then(destDoc => { let numberOfReviews = 1; let ratingTotal = reviewRating; let averageRating = reviewRating; if (destDoc.exists) { // 如果目标文档已存在,累加数据 const destData = destDoc.data(); numberOfReviews = (destData.numberOfReviews || 0) + 1; ratingTotal = (destData.ratingTotal || 0) + reviewRating; averageRating = ratingTotal / numberOfReviews; } // 更新目标文档的聚合数据 return transaction.set(destRef, { numberOfReviews, ratingTotal, averageRating }, { merge: true }); // 使用merge避免覆盖文档其他字段 }); }) .then(() => { console.log(`成功更新目的地${destinationId}的评分聚合数据`); }) .catch(error => { console.error('事务执行失败:', error); throw error; }); });
额外注意事项
- 我添加了对
reviewRating的空值检查,避免因为评论没有评分导致的计算错误 - 处理了目标文档不存在的边界情况(比如第一个评论时,初始化聚合数据)
- 使用
{ merge: true }来更新文档,这样不会覆盖目的地文档里的其他字段(比如名称、描述等) - 如果你的云函数是v2版本,
onWrite的参数会变成(change, context),需要调整为const destinationId = context.params.destId,以及通过change.after.get('reviewRating')获取评分
内容的提问来源于stack exchange,提问作者Vachi
相关产品推荐
相关产品推荐

