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

Angular(TypeScript)应用Firestore模拟器认证问题致数据写入异常

解决Angular Firestore模拟器写入数据不持久化及请求重试问题

1. 开启Firestore模拟器持久化(核心解决重启丢数据问题)

默认情况下,Firestore模拟器运行在内存模式,所有数据仅存在于当前进程内存中,重启模拟器就会丢失。需要开启持久化配置:

  • 启动模拟器时添加参数:
    firebase emulators:start --only firestore --persist-on-exit
    
  • 或者在firebase.json中永久配置:
    "emulators": {
      "firestore": {
        "port": 8080,
        "host": "localhost",
        "persist": true
      }
    }
    

开启后,模拟器会将数据写入本地.firebase/emulators/firestore目录,重启时自动加载。

2. 确保Auth状态就绪后再执行Firestore写入

首次请求失败提示request.auth.uid = null,是因为Angular Auth模块的状态还未完成初始化,就发起了Firestore写入请求。需要等待Auth状态稳定后再操作:

// 示例代码:等待用户Auth状态就绪后执行写入
import { Auth } from '@angular/fire/auth';
import { Firestore, collection, addDoc } from '@angular/fire/firestore';
import { filter, take } from 'rxjs/operators';

// 在组件/服务中
constructor(private auth: Auth, private firestore: Firestore) {}

addData(data: any) {
  // 过滤出已登录的用户状态,仅取一次
  this.auth.user.pipe(
    filter(user => !!user),
    take(1)
  ).subscribe(async user => {
    const colRef = collection(this.firestore, 'your-collection');
    await addDoc(colRef, { ...data, uid: user.uid });
  });
}

同时确保Angular项目正确连接到Auth模拟器,在environment.ts中配置:

export const environment = {
  production: false,
  firebase: {
    apiKey: "your-api-key",
    authDomain: "localhost:9099", // Auth模拟器默认端口9099
    projectId: "your-project-id",
    storageBucket: "your-storage-bucket",
    messagingSenderId: "your-sender-id",
    appId: "your-app-id",
    firestore: {
      host: 'localhost:8080',
      ssl: false
    }
  }
};

3. 调整安全规则避免重试逻辑冲突

如果安全规则依赖用户表查询,需确保用户记录在写入前已存在于模拟器中,或者调整规则逻辑避免因用户表未就绪导致的重试:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 允许已登录用户创建自己的记录,同时检查用户表存在(可选)
    match /your-collection/{doc} {
      allow create: if request.auth != null 
                   && (exists(/databases/$(database)/documents/users/$(request.auth.uid)) 
                       || request.resource.data.uid == request.auth.uid);
    }
  }
}

4. 检查模拟器数据目录权限

模拟器持久化数据默认存储在.firebase/emulators/firestore,确保该目录存在且当前用户有写入权限。如果权限不足,模拟器无法保存数据,重启后仍会丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:13:19