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

AngularFire7.6.1+Ionic7+Capacitor5操作Firestore插入数据报错求助

问题描述

在AngularFire 7.6.1搭配Ionic 7和Capacitor 5的项目中,注册用户到Firebase Auth成功后,执行以下代码创建Firestore用户记录时出现错误:

doc(this.firestore, `users/${credentials.user.uid}`);

错误信息:

FirebaseError: [code=invalid-argument]: Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore.

完整代码如下:

import { Injectable } from '@angular/core';
import {Auth,createUserWithEmailAndPassword,sendPasswordResetEmail,signInWithEmailAndPassword, signOut} from '@angular/fire/auth';
import { doc, Firestore } from '@angular/fire/firestore';
import { setDoc } from '@firebase/firestore';

constructor(private auth: Auth, private firestore: Firestore) { 
}


async register({ email, password }: { email: string; password: string }) {
  try {
    const credentials = await createUserWithEmailAndPassword(
      this.auth,
      email,
      password
    ); // 返回uid和访问令牌等信息
  
    const ref = doc(this.firestore, `users/${credentials.user.uid}`);  // 获取文档引用
    // 触发错误:FirebaseError: [code=invalid-argument]: Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore

    setDoc(ref, { email });// 设置文档内容
    return credentials;    
  } catch (e) {
     return null;    
   }

已参照官方文档调整导入语句,但问题依旧:

import { doc, collection } from '@angular/fire/firestore'; // doc和collection仍无法正常工作,数据库读写失败

需要适配当前版本的Firebase文档操作示例。

解决方案

问题根源是混用了原生Firebase和AngularFire的API:你从@firebase/firestore导入了setDoc,但doc引用的是AngularFire封装的Firestore实例,两者不兼容。

修正步骤:

  • 所有Firestore操作方法(包括setDoc)都从@angular/fire/firestore导入,而非原生Firebase包
  • 确保依赖版本匹配(AngularFire 7.x对应Firebase 9.x+的模块化API)

修正后的完整代码:

import { Injectable } from '@angular/core';
import { Auth, createUserWithEmailAndPassword, sendPasswordResetEmail, signInWithEmailAndPassword, signOut } from '@angular/fire/auth';
// 从@angular/fire/firestore导入所有需要的方法
import { doc, Firestore, setDoc } from '@angular/fire/firestore';

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  constructor(private auth: Auth, private firestore: Firestore) { }

  async register({ email, password }: { email: string; password: string }) {
    try {
      const credentials = await createUserWithEmailAndPassword(
        this.auth,
        email,
        password
      );
  
      const userDocRef = doc(this.firestore, `users/${credentials.user.uid}`);
      await setDoc(userDocRef, { email, createdAt: new Date() });
  
      return credentials;    
    } catch (e) {
      console.error('注册失败:', e);
      return null;    
    }
  }
}

额外注意点:

  • 确保Firestore模块已在app.module.ts中正确导入并配置:imports: [AngularFireModule.initializeApp(environment.firebaseConfig), AngularFireAuthModule, AngularFirestoreModule]
  • 检查Firebase控制台中Firestore的规则是否允许写入(开发环境可临时设置为allow read, write: if true;,生产环境需调整为安全规则)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:05:23