首页 > 解决方案 > Google Firebase Angular Firestore switchMap - Firebase 错误 DocumentReference.set()

问题描述

我正在尝试设置一个 Angular Firebase 应用程序,我想与该应用程序共享的用户数据存储在 Firestore 数据库中。我收到以下错误:

ERROR 错误:未捕获(承诺中):FirebaseError:[code=invalid-argument]:使用无效数据调用的函数 DocumentReference.set()。不支持的字段值:未定义(在字段角色中找到)

我的数据设置如下:

在此处输入图像描述

我的用户服务设置如下:auth.service.ts

import { Injectable } from "@angular/core";
import { Router } from '@angular/router';

import { auth } from 'firebase/app';
import {
    AngularFirestore,
    AngularFirestoreDocument
} from '@angular/fire/firestore'

import { Observable, of } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { User } from './user.model';

import * as firebase from 'firebase';
import { AngularFireAuth } from '@angular/fire/auth';
import { faGameConsoleHandheld } from '@fortawesome/pro-light-svg-icons';

@Injectable({
  providedIn: 'root'
})
export class AuthService {

  user$: Observable<User>;

  constructor(private afAuth: AngularFireAuth,
              private afs: AngularFirestore,
              private router: Router) {
        //This is how we're getting into the firestoreDB        
        this.user$ = this.afAuth.authState.pipe(
          switchMap(user => {
            if (user){
              console.log("user from constructor", user)
              return this.afs.doc<User>(`users/${user.uid}`).valueChanges();
            } else {
                console.log("returning null")
                return of(null)
            }
          })
        )
              } //end constructor

  private updateUserData(user){
    //sets user data to firestore on login
    const userRef: AngularFirestoreDocument<User> = this.afs.doc(`users/${user.uid}`)
    console.log("userRef", userRef)
    const data = {
      uid: user.uid,
      email: user.email,
      displayName: user.displayName,
      role: user.role,
      thursdayCampaign: user.thursdayCampaign,
      menagerieCoast: user.menagerieCoast
    }
    console.log("role:", user.thursdayCampaign)
    return userRef.set(data, { merge: true})
  }

  async emailSignin(value){
    const provider = new firebase.auth.EmailAuthProvider();
    const credential = await this.afAuth.signInWithEmailAndPassword(value.email, value.password)
    return this.updateUserData(credential.user)
  }

user.model.ts:

export interface User {
  uid: string;
  email: string;
  displayName?: string;
  role: string;
  thursdayCampaign: Boolean;
  menagerieCoast: Boolean;

}

我已经缩小了导致错误的问题的范围,应用程序从构造函数中的 this.user$ 返回 null,但我不确定它为什么会这样做。我认为设置 AngularFirestoreDocument 会导致它访问该属性,但事实并非如此。您可以看到我在代码中散布了一些控制台日志功能。当我运行我的函数时,“返回空值”被返回,

标签: angulartypescriptfirebasegoogle-cloud-firestoreangularfire

解决方案


错误消息(强调我的):

使用无效数据调用的函数 DocumentReference.set()。不支持的字段值:未定义(在字段角色中找到)

告诉您您为该role字段传递了一个未定义的值。这意味着你有一个未定义的值user.role。我们不明白为什么会出现这种情况,因此您必须通过找出该user对象的来源来调试它。


推荐阅读