Firebase使用async/await执行事务报错:Argument "updateFunction"不是有效函数
解决Firebase Firestore事务中async/await使用时的"Argument 'updateFunction' is not a valid function"错误
嘿,这个问题我太熟了!你踩了Firestore事务API的一个基础坑——调用runTransaction的方式完全不符合要求。
错误原因分析
Firestore的runTransaction方法要求你传入一个异步函数作为参数,这个函数才是承载所有事务逻辑(获取文档、修改数据、更新文档)的地方。而你现在直接调用了runTransaction(),没有传这个核心的处理函数,Firestore自然会报错说"updateFunction不是有效函数"——因为它根本没收到需要执行的事务逻辑呀!
你之前的写法把事务对象拿到函数外面操作,这完全违背了Firestore事务的设计机制,事务必须在指定的回调函数内执行,这样Firestore才能帮你处理并发冲突、自动重试这些关键逻辑。
修正后的代码
直接给你改好的正确实现:
const docRef = admin.firestore().collection("docs").doc(docId); // 核心:把事务逻辑封装成异步函数传给runTransaction await admin.firestore().runTransaction(async (transaction) => { // 所有事务操作都要通过这个transaction对象执行 const doc = await transaction.get(docRef); if (!doc.exists) { throw new Error("doc not found"); // 建议用Error对象代替字符串抛出 } const newLikes = doc.data().likes + 1; await transaction.update(docRef, { likes: newLikes }); });
几个关键注意点
- 事务的所有操作(
get/update/set)必须通过runTransaction回调里的transaction对象执行,不能用外部的数据库引用直接操作 - 回调函数必须是异步的(加
async),这样才能在里面用await处理异步操作 - 用
await包裹runTransaction本身,确保整个事务完成后再执行后续代码 - 如果事务中抛出错误,Firestore会自动终止事务并尝试重试(默认重试一定次数),所以抛出明确的错误信息很重要
内容的提问来源于stack exchange,提问作者rendom
相关产品推荐
相关产品推荐

