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

React Native中基于Firestore用户表字段查询认证用户邮箱方案咨询

实现方案

Firebase 客户端SDK不提供直接批量获取认证用户列表的能力,可根据使用场景选择以下两种实现方式:


方案1:优先推荐:Firestore用户文档冗余存储邮箱

在用户注册、修改邮箱时同步将邮箱字段写入users集合的对应用户文档中,无需额外调用Auth接口即可直接查询,性能最优。
React Native查询代码示例:

import firestore from '@react-native-firebase/firestore';

// 查询所有订阅生效的用户数据
const getActiveSubscriptionUsers = async () => {
  const snapshot = await firestore()
    .collection('users')
    .where('Info.Subscription.active subscription', '==', true)
    .get();
  
  const userList = snapshot.docs.map(doc => {
    const userData = doc.data();
    return {
      uid: doc.id,
      email: userData.email, // 提前冗余存储的邮箱字段
      ...userData
    }
  });
  return userList;
}

优势:

  • 无需额外调用Auth接口,查询速度快、资源成本更低
  • 前端可独立实现,无需额外后端逻辑

方案2:通过Firebase云函数(Admin SDK)实现

如果不想在Firestore冗余存储邮箱,可通过云函数在服务端调用Admin SDK批量查询认证用户信息,前端调用云函数获取结果即可。

云函数端代码(Node.js)

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.getActiveSubUsersWithEmail = functions.https.onCall(async (data, context) => {
  // 1. 查询Firestore中订阅生效的用户
  const firestoreSnapshot = await admin.firestore()
    .collection('users')
    .where('Info.Subscription.active subscription', '==', true)
    .get();
  
  const uidList = firestoreSnapshot.docs.map(doc => doc.id);
  const result = [];

  // 2. 批量从Auth获取用户信息
  for (const uid of uidList) {
    try {
      const userRecord = await admin.auth().getUser(uid);
      const userData = firestoreSnapshot.docs.find(doc => doc.id === uid).data();
      result.push({
        uid,
        email: userRecord.email,
        ...userData
      })
    } catch (err) {
      console.log(`获取uid ${uid} 的用户信息失败:`, err);
    }
  }
  return result;
})

React Native前端调用代码

import functions from '@react-native-firebase/functions';

const getActiveUsers = async () => {
  const { data } = await functions().httpsCallable('getActiveSubUsersWithEmail')();
  console.log('带邮箱的活跃订阅用户列表:', data);
  return data;
}

注意事项:

  • Admin SDK仅可在服务端/云函数环境使用,不可集成到React Native客户端中,避免权限泄露
  • 若用户量级较大可使用getUsers批量查询接口优化性能,单次最多查询1000个uid

补充:仅查询当前登录用户的场景

如果只需要判断当前登录用户的订阅状态、获取自身邮箱,不需要上述批量逻辑,可直接使用以下代码:

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

const getCurrentUserEmailIfActive = async () => {
  const currentUid = auth().currentUser?.uid;
  if (!currentUid) return null;
  // 查询当前用户的订阅状态
  const userDoc = await firestore().collection('users').doc(currentUid).get();
  const isActive = userDoc.data()?.Info?.Subscription?.['active subscription'] === true;
  if (isActive) {
    // 直接从当前登录用户的Auth实例拿邮箱
    return auth().currentUser.email;
  }
  return null;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:57:03