我正在尝试设置Angular Firebase应用程序,我要与该应用程序共享的用户数据存储在Firestore数据库中。我收到以下错误:
错误错误:未捕获(承诺):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)
}
我已经缩小了导致错误的问题,该应用程序正在从构造函数中的this.user $返回null,但是我不确定为什么要这样做。我认为设置AngularFirestoreDocument会导致它访问该属性,但事实并非如此。您可以看到我的代码中散布了一些控制台日志功能。运行函数时返回“返回null”,
错误信息(重点为我:):
Function DocumentReference.set()用无效数据调用。 不支持的字段值:未定义(在字段角色中找到)
告诉您,您为role
字段传递了未定义的值。这意味着您在user.role
中有一个未定义的值。我们看不到为什么在这里,因此您必须通过找出user
对象的来源来对其进行调试。