You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用react-native-firebase的firestore.runTransaction时遇错误求助

问题排查:React Native Firebase Firestore Transaction 调用失败

你遇到的undefined is not an object (evaluating 'ref[method].apply')错误,核心原因是在Transaction操作里传入了字符串路径而非Firestore的Document Reference实例,再加上部分调用方式的使用误区,导致了报错。下面一步步帮你拆解问题和解决方法:

核心错误原因

  1. Transaction参数类型错误:你在tx.get(ref)里传入的是字符串路径lists/${listKey},但Firestore的Transaction方法(get/update等)必须接收Firestore Document/Collection Reference实例,而非纯字符串路径,这是触发报错的直接原因。
  2. 调用方式的误区:你尝试的三种调用方式各自存在问题:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:15:53