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

使用async/await调用Firebase setDoc触发权限不足错误求助

解决Firebase Firestore权限错误(Missing or insufficient permissions)

1. 核心问题:Firestore安全规则限制

你遇到的报错是因为Firestore默认的安全规则会限制未授权的读写操作,而注册场景下用户还未完成身份认证,所以触发了权限拦截。

两种规则调整方案

方案一:开发环境临时开放(测试用)

在Firebase控制台的「Firestore数据库→规则」页面,替换为以下规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

⚠️ 重要提醒:上线前必须修改为严格规则,否则会导致数据库被恶意访问。

方案二:注册场景专属规则(推荐)

针对新用户注册的需求,配置允许合法写入的规则,同时做基础校验:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      // 允许创建用户文档,同时验证文档ID与userName一致,且字段格式合法
      allow create: if request.resource.id == request.resource.data.userName &&
                    request.resource.data.name is string &&
                    request.resource.data.surname is string &&
                    request.resource.data.phone is string &&
                    request.resource.data.code.size() == 3;
      // 已认证用户仅能读写自己的文档
      allow read, update, delete: if request.auth != null && request.auth.uid == userId;
    }
  }
}

2. 代码优化建议

你的提交函数存在await与.then()混用的问题,且未处理异常,建议调整为:

const submit = async () => {
    // 先清空之前的错误状态
    setNameError(false);
    setSurnameError(false);
    setPhoneError(false);
    setCodeError(false);

    const isValid = name.length >= 3 && surname.length >= 3 && phone.length >= 9 && code.length === 3;
    
    if (!isValid) {
        name.length <= 2 && setNameError(true);
        surname.length <= 2 && setSurnameError(true);
        phone.length <= 8 && setPhoneError(true);
        code.length !== 3 && setCodeError(true);
        return;
    }

    try {
        const userName = name + surname;
        const ref = doc(db, 'users', userName);
        const data = { name, surname, phone, code, userName };
        
        await setDoc(ref, data);
        window.alert('Регистрацијата е успешна!');
        router('/');
    } catch (error) {
        console.error('注册失败:', error);
        window.alert('注册失败,请稍后重试');
    }
}

优化点:

  • 提前清空错误状态,避免旧状态残留
  • 合并校验逻辑,代码更简洁
  • 用try/catch捕获异常,避免控制台抛出未处理Promise错误
  • 解构赋值简化数据对象

额外注意事项

  • 注意userName(姓名拼接)可能重复,会导致覆盖已有用户数据,建议改用Firebase Auth的uid作为文档ID,或提前添加用户名唯一性校验
  • 上线前务必将Firestore规则切换为严格模式,保障数据安全

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:54:19