angular - 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 会导致它访问该属性,但事实并非如此。您可以看到我在代码中散布了一些控制台日志功能。当我运行我的函数时,“返回空值”被返回,
解决方案
错误消息(强调我的):
使用无效数据调用的函数 DocumentReference.set()。不支持的字段值:未定义(在字段角色中找到)
告诉您您为该role
字段传递了一个未定义的值。这意味着你有一个未定义的值user.role
。我们不明白为什么会出现这种情况,因此您必须通过找出该user
对象的来源来调试它。
推荐阅读
- python - 为什么 python 中的 hash() 函数需要恒定的时间来操作可变长度的字符串?
- c# - C# SRI 哈希生成器
- vue.js - 输入字段的绑定值在 Vue 中不会更新
- laravel - Laravel Yajra 数据表原始 SQL
- ansible - 如何列出所有当前的 ansible 库存组列表
- html - 2020 年的 HTML 副标题标记
- unity3d - 如何使统一构建文件夹共享相同的资产
- java - keycloak 管理客户端在 executeActionsEmail() 上返回 400
- teamcity - 将工件 a、b、c 发布为 a.zip、b.zip、c.zip
- python - UpdateMany 给出错误:“集合”对象不可调用