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

React Native如何正确获取Firestore文档的所有值

问题根因

你的代码有两处核心错误:

  1. getDoc()是Firestore提供的异步接口,调用后会立即返回一个Promise对象。你没有等待异步请求返回结果就直接打印booking变量,拿到的自然是未解析完成的Promise实例,也就是控制台输出的带_U/_V等内部属性的结构,完全不是实际文档数据。
  2. 即使Promise解析完成,getDoc()返回值是DocumentSnapshot文档快照对象,不是文档本身存储的字段数据,必须调用快照对象的.data()方法,才能取出文档里的实际键值对内容。
修正代码

从你写的View/Text组件判断你用的是React Native栈,异步数据请求不能直接写在组件函数顶层,必须放到useEffect钩子中执行,同时增加加载状态避免渲染异常,完整修正后的代码如下:

import { useEffect, useState } from 'react';
import { View, Text, ActivityIndicator } from 'react-native';
import { doc, getDoc } from 'firebase/firestore';
// 替换成你项目里实际的db实例导入路径
import { db } from './firebase/config';

const MatchScreen = ({route}) => {
  const id = route.params.id;
  const [booking, setBooking] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchDoc = async () => {
      try {
        const docRef = doc(db, 'bookings', id);
        const docSnap = await getDoc(docRef);
        if (docSnap.exists()) {
          // 合并文档ID和文档字段,得到完整数据
          const fullData = {
            id: docSnap.id,
            ...docSnap.data()
          };
          setBooking(fullData);
          console.log('文档完整数据:', fullData);
        } else {
          console.log('当前id无对应文档');
        }
      } catch (err) {
        console.error('拉取文档失败:', err);
      } finally {
        setLoading(false);
      }
    };

    fetchDoc();
  }, [id]);

  // 加载中状态
  if (loading) {
    return (
      <View style={{flex:1, justifyContent: 'center', alignItems: 'center'}}>
        <ActivityIndicator size="large" />
      </View>
    )
  }

  return (
    <View style = {{justifyContent: 'center', alignItems: 'center'}}>
      <Text>文档ID:{id}</Text>
      {/* 按需渲染booking里的字段,比如booking.userName、booking.time等 */}
      {booking && <Text>{JSON.stringify(booking)}</Text>}
    </View>
  )
}

export default MatchScreen;
注意事项
  • 永远不要在组件函数顶层直接写await调用异步接口,组件渲染是同步过程,顶层异步逻辑会引发重复请求、状态不一致等问题
  • 取数据前必须判断docSnap.exists(),如果传入的id在集合中不存在,.data()会返回undefined,直接渲染会导致页面崩溃
  • 如果需要实时监听文档的变动(比如其他端修改了文档内容自动同步到当前页面),可以把getDoc一次性拉取替换为onSnapshot监听,数据解析逻辑完全一致

内容的提问来源于stack exchange,提问作者Mihailo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:33:11