Firestore Cloud Functions执行耗时150-250ms是否正常?代码是否有误?
问题解答
耗时是否正常?
150-250ms的执行耗时属于Firestore触发器云函数的正常范围,原因包括:
- 云函数存在冷启动开销:如果函数一段时间没被触发,再次执行时需要初始化运行环境,这部分时间会占很大比例;
- Firestore操作的网络与内部处理:更新文档涉及到与Firestore服务端的网络通信、事务处理等,这些都需要额外时间,不是单纯代码逻辑的执行时长;
- 日志输出的延迟:日志打印也会占用少量时间,尤其是对象序列化的过程。
代码存在的问题及修正
你的代码有几处明显问题,可能导致错误或不规范:
1. 错误获取文档ID
snapshot.data()返回的是文档的数据内容,不包含文档ID字段,你应该直接使用snapshot.id来获取被删除文档的ID,而不是从deletedData.id取值(如果文档本身没有存储id字段,这里会得到undefined)。
2. 错误的对象日志打印
console.log('deletedDoc' + deletedData);会将对象转换为字符串[object Object],无法查看实际数据,应该使用逗号分隔来打印完整对象。
3. 冗余的集合路径斜杠
db.collection(test-docs/).doc('user-counter');中的斜杠是多余的,Firestore会自动处理,但规范写法应该去掉末尾斜杠。
4. 缺少返回值
异步云函数需要返回一个Promise或值,否则可能导致云函数提前终止或出现运行时警告。
修正后的代码
import * as functions from 'firebase-functions'; import * as admin from 'firebase-admin'; const db = admin.firestore(); export const deleteTestDoc = functions.firestore .document('test-docs/{docId}') .onDelete(async (snapshot) => { const deletedData = snapshot.data(); console.log('deletedDoc', deletedData); // 修正日志打印 const docId = snapshot.id; // 修正文档ID获取方式 if (!deletedData) { console.log('No data found for deleted document'); return null; } const docTime = deletedData.time; const counterRef = db.collection('test-docs').doc('user-counter'); // 去掉冗余斜杠 try { await counterRef.update({ deleted: admin.firestore.FieldValue.increment(1), docTime: docTime, }); console.log(`Transaction success! Increment field deleted for id: ${docId}`); return { status: 'success', docId }; // 添加返回值 } catch (err) { console.log('Transaction failure:', err); return { status: 'error', error: err.message }; // 添加返回值 } });
内容的提问来源于stack exchange,提问作者Bourbon
相关产品推荐
相关产品推荐

