使用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
相关产品推荐
相关产品推荐

