我编写了一个Firestore cloudfunction,它在我的firestore数据库的用户集合中创建了一个文档(随后是Fireship.io云功能视频课程)。
除了由于某种原因,用户的displayName属性没有传递到我的用户文档中之外,触发器似乎(几乎)正常工作。
这是我的云功能的代码。
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
const db = admin.firestore();
export const onNewUser =functions.auth
.user()
.onCreate((user, context) => {
const userRef = db.doc(`user/${user.uid}`);
return userRef.set({
name: user.displayName,
createdAt: context.timestamp,
email: user.email,
verified: user.emailVerified,
id: user.uid
})
});
当我创建新用户时(我正在使用Angular <ngx-auth-firebaseui>
在我的angular应用程序中注册并登录新用户),将在firestore中创建新用户文档,但不会将提供的displayName复制到用户文档集合。我在firebase控制台上确认了这一点。
我怀疑displayName可能没有以某种方式保存在身份验证用户对象中,但这不是问题。我可以使用AngularFireAuth.authState从用户对象中检索displayName,只是不会通过onCreate触发器将其写入用户文档中。
PS。有没有办法在Firebase控制台中检查用户的所有数据,包括displayName?在身份验证窗格上,我只能看到用户“ identified”(电子邮件地址)和UID。
修改
最初创建用户的方式是包含ngx-auth-firebaseui提供的登录和注册表单,该表单处理Angular firebase应用程序的用户注册和身份验证的所有实现。
我的authservice中的代码使用户注册后可以从身份验证服务中检索displayName:
import { Observable, of } from 'rxjs';
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { auth } from 'firebase/app';
import { AngularFirestore, AngularFirestoreDocument } from '@angular/fire/firestore'
import { AngularFireAuth } from '@angular/fire/auth';
import { switchMap } from 'rxjs/operators'
import { User } from './common/interfaces/user.model'
@Injectable({
providedIn: 'root'
})
export class AuthService {
user$: Observable<User | null>;
userId: string = "";
userFirstName: string = "";
loggedInState: boolean = false;
constructor(
private afAuth: AngularFireAuth,
private afs: AngularFirestore,
private router: Router
) {
this.user$ = this.afAuth.authState.pipe(
switchMap(user => {
if (user) {
return this.afs.doc<User>(`users/${user.uid}`).valueChanges();
} else {
return of(null);
}
})
);
this.user$.subscribe(foo => {
if (foo) {
this.userId = foo.uid;
console.log(`uid: ${this.userId}`)
if (foo.displayName) {this.userFirstName = foo.displayName.split(" ")[0]} else {this.userFirstName = foo.email};
this.loggedInState=true;
} else {
this.userId = null;
this.loggedInState=false;
}
})
}