react-native-firebase多模块集成:Auth+Firestore+Storage最佳实践

【免费下载链接】react-native-firebase invertase/react-native-firebase: 是一个用于 React Native 的 Firebase 集成库,可以方便地在 React Native 应用中集成 Firebase 服务。适合对 React Native、Firebase 和想要实现 React Native 与 Firebase 集成的开发者。 【免费下载链接】react-native-firebase 项目地址: https://gitcode.com/gh_mirrors/re/react-native-firebase

你还在为React Native应用集成Firebase服务时的配置繁琐、模块冲突而头疼吗?本文将带你一步解决Auth(用户认证)、Firestore(云数据库)和Storage(云存储)三大核心模块的协同集成问题,让你轻松构建安全高效的移动后端系统。读完本文,你将掌握:多模块无缝衔接的实战方案、用户认证状态与数据访问的联动策略、文件上传与数据库记录的原子操作技巧。

准备工作:环境搭建与核心依赖

在开始多模块集成前,需确保已完成react-native-firebase的基础配置。核心步骤包括安装App模块(基础依赖)和目标功能模块,具体命令如下:

# 安装核心App模块
yarn add @react-native-firebase/app

# 安装Auth、Firestore、Storage模块
yarn add @react-native-firebase/auth @react-native-firebase/firestore @react-native-firebase/storage

# iOS平台需额外执行
cd ios && pod install

基础配置详情可参考官方安装文档iOS配置指南。项目结构中,各模块的核心实现位于packages/目录下,例如Auth模块源码Firestore模块源码Storage模块源码,便于深入调试。

Auth模块:用户认证体系构建

Firebase Auth(认证)模块提供了邮箱密码、第三方登录等多种认证方式,其核心价值在于与其他Firebase服务的权限联动。以下是邮箱密码认证的基础实现:

import React, { useState } from 'react';
import { View, TextInput, Button } from 'react-native';
import { getAuth, createUserWithEmailAndPassword } from '@react-native-firebase/auth';

const RegisterScreen = () => {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const auth = getAuth();

  const handleRegister = async () => {
    try {
      const userCredential = await createUserWithEmailAndPassword(auth, email, password);
      console.log('用户创建成功:', userCredential.user.uid);
      // 注册成功后可直接跳转至主页或引导完善资料
    } catch (error) {
      console.error('注册失败:', error.code);
      if (error.code === 'auth/email-already-in-use') {
        alert('该邮箱已被注册');
      }
    }
  };

  return (
    <View>
      <TextInput placeholder="邮箱" value={email} onChangeText={setEmail} keyboardType="email-address" />
      <TextInput placeholder="密码" value={password} onChangeText={setPassword} secureTextEntry />
      <Button title="注册" onPress={handleRegister} />
    </View>
  );
};

认证状态监听是实现用户状态全局管理的关键,建议在App根组件中集成:

import { useEffect, useState } from 'react';
import { getAuth, onAuthStateChanged } from '@react-native-firebase/auth';

const App = () => {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const auth = getAuth();
    const subscriber = onAuthStateChanged(auth, (currentUser) => {
      setUser(currentUser);
      setLoading(false);
    });
    return subscriber; // 组件卸载时取消监听
  }, []);

  if (loading) return null; // 可替换为启动屏

  return user ? <MainApp /> : <AuthStack />;
};

更多认证方式(如Google登录、手机验证码)可参考Auth模块完整文档

Firestore模块:实时数据管理

Firestore(云 Firestore)是NoSQL文档数据库,支持实时数据同步和离线访问。以下是用户资料管理的典型应用场景,结合Auth模块的用户ID实现数据隔离:

import firestore from '@react-native-firebase/firestore';
import { getAuth } from '@react-native-firebase/auth';

// 获取当前用户资料
const getUserProfile = async () => {
  const auth = getAuth();
  if (!auth.currentUser) return null;

  const docRef = firestore().collection('users').doc(auth.currentUser.uid);
  const docSnap = await docRef.get();
  
  if (docSnap.exists) {
    return docSnap.data();
  } else {
    // 用户首次登录,初始化资料
    await docRef.set({ createdAt: firestore.FieldValue.serverTimestamp() });
    return { createdAt: new Date() };
  }
};

// 实时监听用户资料变化
const subscribeToProfile = (onUpdate) => {
  const auth = getAuth();
  if (!auth.currentUser) return;

  return firestore()
    .collection('users')
    .doc(auth.currentUser.uid)
    .onSnapshot((snapshot) => {
      onUpdate(snapshot.data());
    });
};

数据查询支持复杂条件组合,例如筛选18岁以上用户并按注册时间排序:

const queryUsers = async () => {
  const snapshot = await firestore()
    .collection('users')
    .where('age', '>=', 18)
    .orderBy('createdAt', 'desc')
    .limit(20)
    .get();

  return snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
};

事务操作确保数据一致性,例如实现帖子点赞功能(防止并发问题):

const likePost = async (postId) => {
  const postRef = firestore().doc(`posts/${postId}`);
  
  return firestore().runTransaction(async (transaction) => {
    const postSnap = await transaction.get(postRef);
    if (!postSnap.exists) throw new Error('帖子不存在');
    
    const newLikes = (postSnap.data().likes || 0) + 1;
    transaction.update(postRef, { likes: newLikes });
    return newLikes;
  });
};

Firestore高级用法(如索引配置、批量操作)详见官方文档

Storage模块:文件上传与管理

Cloud Storage(云存储)专为存储用户生成内容(如照片、视频)设计,结合Firestore可实现完整的媒体内容管理流程。以下是用户头像上传的示例,包含进度监听和上传后的数据联动:

import React, { useState } from 'react';
import { View, Button, Image, ProgressViewIOS, ProgressBarAndroid } from 'react-native';
import storage from '@react-native-firebase/storage';
import firestore from '@react-native-firebase/firestore';
import { getAuth } from '@react-native-firebase/auth';
import { utils } from '@react-native-firebase/app';

const AvatarUpload = () => {
  const [progress, setProgress] = useState(0);
  const [avatarUrl, setAvatarUrl] = useState('');

  const uploadAvatar = async (uri) => {
    const auth = getAuth();
    if (!auth.currentUser) return;

    // 创建存储引用(使用用户ID确保唯一性)
    const reference = storage().ref(`avatars/${auth.currentUser.uid}.jpg`);
    
    // 上传文件(uri为相机/相册返回的文件路径)
    const task = reference.putFile(uri);
    
    // 监听上传进度
    task.on('state_changed', (taskSnapshot) => {
      const percent = (taskSnapshot.bytesTransferred / taskSnapshot.totalBytes) * 100;
      setProgress(percent);
    });

    try {
      await task;
      const url = await reference.getDownloadURL();
      setAvatarUrl(url);
      
      // 同步更新Firestore中的头像URL
      await firestore()
        .collection('users')
        .doc(auth.currentUser.uid)
        .update({ avatarUrl });
    } catch (error) {
      console.error('上传失败:', error);
    }
  };

  return (
    <View>
      {avatarUrl ? <Image source={{ uri: avatarUrl }} style={{ width: 100, height: 100 }} /> : null}
      {Platform.OS === 'ios' ? (
        <ProgressViewIOS progress={progress / 100} />
      ) : (
        <ProgressBarAndroid progress={progress / 100} styleAttr="Horizontal" />
      )}
      <Button title="选择头像" onPress={() => {/* 调用相机/相册逻辑 */}} />
    </View>
  );
};

文件访问权限控制通过Firebase控制台的安全规则实现,例如限制仅所有者可读写自己的头像:

// storage安全规则示例
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /avatars/{userId}.jpg {
      allow read;
      allow write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

多模块协同:实战场景整合

用户注册完整流程

结合Auth+Firestore+Storage实现用户注册→资料完善→头像上传的闭环:

// 注册流程整合示例
const completeRegistration = async (userData, avatarUri) => {
  const auth = getAuth();
  const { email, password, name, age } = userData;
  
  try {
    // 1. 创建用户(Auth)
    const { user } = await createUserWithEmailAndPassword(auth, email, password);
    
    // 2. 保存用户资料(Firestore)
    await firestore().collection('users').doc(user.uid).set({
      name,
      age,
      email,
      createdAt: firestore.FieldValue.serverTimestamp()
    });
    
    // 3. 上传并关联头像(Storage+Firestore)
    if (avatarUri) {
      const storageRef = storage().ref(`avatars/${user.uid}.jpg`);
      await storageRef.putFile(avatarUri);
      const avatarUrl = await storageRef.getDownloadURL();
      
      await firestore().collection('users').doc(user.uid).update({ avatarUrl });
    }
    
    return { success: true, user };
  } catch (error) {
    console.error('注册流程失败:', error);
    return { success: false, error };
  }
};

数据一致性保障

使用事务和批量操作确保多模块间的数据一致性:

// 批量删除用户所有数据(用于账户注销)
const deleteUserAccount = async () => {
  const auth = getAuth();
  const user = auth.currentUser;
  if (!user) return;
  
  try {
    // 1. 删除Storage文件
    const avatarRef = storage().ref(`avatars/${user.uid}.jpg`);
    await avatarRef.delete().catch(() => console.log('头像不存在'));
    
    // 2. 批量删除Firestore数据
    const batch = firestore().batch();
    const userDoc = firestore().collection('users').doc(user.uid);
    const postsQuery = firestore().collection('posts').where('authorId', '==', user.uid);
    
    const postsSnapshot = await postsQuery.get();
    postsSnapshot.forEach(doc => batch.delete(doc.ref));
    batch.delete(userDoc);
    
    await batch.commit();
    
    // 3. 删除用户账户(Auth)
    await user.delete();
  } catch (error) {
    console.error('账户删除失败:', error);
    throw error;
  }
};

常见问题与优化建议

性能优化

  1. 数据监听优化:避免在列表项中单独订阅文档,使用集合查询+onSnapshot一次监听(参考Firestore性能优化
  2. 图片压缩:上传前压缩图片尺寸和质量,推荐使用react-native-image-picker的压缩配置
  3. 缓存策略:利用Firestore的离线持久化和Storage的缓存控制

错误处理

错误类型 可能原因 解决方案
auth/network-request-failed 网络不稳定 检查网络连接,实现重试机制
firestore/permission-denied 安全规则限制 检查规则配置和认证状态
storage/unauthorized 存储权限不足 验证安全规则和用户登录状态

调试工具

  • Firebase控制台:实时监控认证事件、数据库操作和存储使用情况
  • React Native Debugger:断点调试异步操作和状态变化
  • Emulator Suite:本地模拟Firebase服务,避免消耗生产环境配额(模拟器配置

总结与扩展

通过本文介绍的Auth+Firestore+Storage集成方案,你已掌握React Native Firebase多模块协作的核心能力。实际开发中可根据需求扩展更多服务:

完整API文档和高级用法可查阅项目官方文档,社区问题解决方案可参考FAQ文档

提示:定期通过yarn upgrade @react-native-firebase/app @react-native-firebase/auth @react-native-firebase/firestore @react-native-firebase/storage更新依赖,以获取最新功能和安全修复。

【免费下载链接】react-native-firebase invertase/react-native-firebase: 是一个用于 React Native 的 Firebase 集成库,可以方便地在 React Native 应用中集成 Firebase 服务。适合对 React Native、Firebase 和想要实现 React Native 与 Firebase 集成的开发者。 【免费下载链接】react-native-firebase 项目地址: https://gitcode.com/gh_mirrors/re/react-native-firebase

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐