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

Flutter使用Google Cloud Functions Firestore触发器获取UID问题

解决方案1:在业务文档中存储操作人UID(最常用方案)

这是目前官方推荐的替代方案,实现成本最低:

  • 第一步:客户端执行trainings文档的新增/删除操作时,额外写入operatorUid字段存储当前登录用户的UID
  • 第二步:配置Firestore安全规则强制校验该字段的合法性,避免用户伪造他人UID,规则示例:
match /users/{userId}/trainings/{trainingId} {
  allow create: if request.auth != null && request.resource.data.operatorUid == request.auth.uid;
  allow delete: if request.auth != null && resource.data.operatorUid == request.auth.uid;
  // 其他权限逻辑自行补充
}
  • 第三步:在Cloud Function触发器中直接读取该字段即可拿到操作人UID,修改后的代码如下:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const {FieldValue} = require("@google-cloud/firestore/build/src");

admin.initializeApp(functions.config().functions);
// 原硬编码用户ID改为从路径参数取,适配多用户场景
exports.countDocs = functions.firestore
    .document('/users/{userId}/trainings/{trainings}')
    .onWrite((change, context) => {
        // 从路径参数拿到归属用户ID
        const docPathUserId = context.params.userId;
        // 从文档中取实际操作人的UID
        const operatorUid = change.after.exists ? change.after.data().operatorUid : change.before.data().operatorUid;
        // 动态生成计数文档路径
        const countDoc = admin.firestore().collection('users').doc(docPathUserId).collection('user').doc('general');

        if (!change.before.exists) {
            countDoc.update({numberOfDocs: FieldValue.increment(1)});
        } else if (!change.after.exists) {
            countDoc.update({numberOfDocs: FieldValue.increment(-1)});
        }
    });

解决方案2:用可调用云函数封装读写操作

如果不想在业务文档里加额外字段,可以放弃使用Firestore触发器,把文档的新增、删除逻辑全部封装到Firebase可调用云函数中,可调用云函数可以直接通过context.auth.uid拿到当前请求用户的UID,示例代码:

// 新增training文档的可调用函数
exports.addTraining = functions.https.onCall(async (data, context) => {
  // 直接拿到当前用户UID
  const uid = context.auth.uid;
  if (!uid) throw new functions.https.HttpsError('unauthenticated', '请先登录');
  // 执行新增逻辑
  await admin.firestore().collection('users').doc(uid).collection('trainings').add(data.trainingData);
  // 同时更新计数
  await admin.firestore().collection('users').doc(uid).collection('user').doc('general').update({
    numberOfDocs: FieldValue.increment(1)
  });
  return {success: true};
});

删除逻辑同理封装即可,客户端直接调用对应云函数执行操作,不要直接读写Firestore,即可稳定获取操作用户UID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:06:02