Firestore云功能创建用户触发器不提供显示名称吗?

时间:2020-03-18 01:31:40

标签: angular firebase google-cloud-firestore

我编写了一个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;

      }
    })

  }

0 个答案:

没有答案