使用react-native-firebase的firestore.runTransaction时遇错误求助
问题排查:React Native Firebase Firestore Transaction 调用失败
你遇到的undefined is not an object (evaluating 'ref[method].apply')错误,核心原因是在Transaction操作里传入了字符串路径而非Firestore的Document Reference实例,再加上部分调用方式的使用误区,导致了报错。下面一步步帮你拆解问题和解决方法:
核心错误原因
- Transaction参数类型错误:你在
tx.get(ref)里传入的是字符串路径lists/${listKey},但Firestore的Transaction方法(get/update等)必须接收Firestore Document/Collection Reference实例,而非纯字符串路径,这是触发报错的直接原因。 - 调用方式的误区:你尝试的三种调用方式各自存在问题:
rnFirebase.firestore().runTransaction(...):写法本身没问题,但后续传入的ref是字符串,导致内部执行失败firestore.runTransaction(...):这里的firestore是导入的模块而非初始化后的实例,直接调用静态方法必然报错firestore().runTransaction(...):旧版RN Firebase不支持这种解构调用方式,必须通过初始化后的App实例获取Firestore对象
解决步骤
步骤1:获取正确的Firestore Document Reference
不管用原生RN Firebase还是redux-firestore的getFirestore(),都要先获取对应的Document Reference实例,而非直接传字符串路径。修改你的action creator代码:
// ./redux/modules/lists.js import RNFirebase from 'react-native-firebase' // ... // Async Action Creator export const addToList = (attraction, listKey) => { return async (dispatch, getState, {getFirestore}) => { const reduxFirestore = getFirestore() try { // 1. 生成Document Reference实例,替换原字符串路径 const listDocRef = reduxFirestore.collection('lists').doc(listKey); // 也可以用RN Firebase原生方式获取: // const listDocRef = RNFirebase.firestore().collection('lists').doc(listKey); const res = await reduxFirestore.get(listDocRef) // 这里也同步改成传入ref实例 const {attractionsIndex} = res.data() // 2. Transaction内部使用Document Reference实例 await RNFirebase.firestore().runTransaction(async tx => { const doc = await tx.get(listDocRef) // 传入正确的ref实例 if (doc.exists) { console.warn('exists!') } else { console.warn('does not exist!') } }) } catch(err) { console.error(err) } } }
步骤2:确认Firestore初始化与调用一致性
你的Redux Store初始化代码中,RNFirebase.firestore()的调用是正确的。另外,redux-firestore返回的实例和RN Firebase原生实例API一致,你也可以直接用它来调用Transaction:
// 用redux-firestore实例调用transaction await reduxFirestore.runTransaction(async tx => { const doc = await tx.get(listDocRef) // ...后续操作 })
步骤3:修正导入方式
旧版(v4.x)RN Firebase的正确导入方式是:
import RNFirebase from 'react-native-firebase'; const firestore = RNFirebase.firestore(); // 通过初始化后的App实例获取Firestore对象
不要直接解构导入firestore,因为那是模块本身而非可用实例。
额外注意事项
- Transaction操作必须保持原子性,内部所有读写都要通过
tx对象执行,不能直接调用Firestore实例 - 确保RN Firebase与redux-firestore版本兼容,版本不匹配也可能导致API调用异常
- 检查Firestore安全规则,虽然当前错误不是权限问题,但权限不足也可能引发类似异常
内容的提问来源于stack exchange,提问作者smoll
相关产品推荐
相关产品推荐

