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

时间:2019-08-13 15:16:08

标签: javascript angular firebase ionic-framework google-cloud-firestore

因此,我正在尝试为应用创建注册表单,除了它引发错误外,其他所有功能似乎都正常运行。 数据似乎出现在我的数据库中,但是当我尝试“ ng serve”时,编译器给出了一个错误。

我的浏览器控制台显示以下语句:

  

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

这和标题说的一样。

"ERROR in src/app/core/auth.service.ts(57,11): error TS2740: Type '{ uid: any; email: any;
displayName: any; photoURL: any; }' is missing the following properties from type 'User': delete, emailVerified, getIdTokenResult, getIdToken, and 24 more."

由于我正在阅读教程,因此我尝试查找语法错误。尝试检查是否没有大写小写字母等。

以下是我的auth.service.ts文件

import { Injectable } from "@angular/core";
import { Router } from "@angular/router";
import { AngularFireAuth } from "angularfire2/auth";
import {
  AngularFirestore,
  AngularFirestoreDocument
} from "angularfire2/firestore";
import { Observable } from "rxjs/Observable";
import "rxjs/add/operator/switchMap";
import { User } from "firebase";
import { of } from "rxjs";

 interface user {
   uid: string;
   email: string;
   photoURL ? : string;
   displayName ? : string;
 }

 @Injectable()
 export class AuthService {
   user: Observable < user >

     constructor(
       private afAuth: AngularFireAuth,
       private afs: AngularFirestore,
       private router: Router
     ) {
       this.user = this.afAuth.authState.switchMap(user => {
         if (user) {
           return this.afs.doc < User > ('users/${user.uid}').valueChanges();
         } else {
           return of(null)
         }
       })
     }

   emailSignIn(email: string, password: string) {
     return this.afAuth.auth.signInWithEmailAndPassword(email, password)
       .then(() => console.log("You have successfully signed in"))
       .catch(error => console.log(error.message))
   }

   emailSignUp(email: string, password: string) {
     return this.afAuth.auth.createUserWithEmailAndPassword(email, password)
       .then(user => this.updateUserData(user))
       .then(() => console.log("Welcome, your account has been created!"))
       .catch(error => console.log(error.message))
   }

   signOut() {
     return this.afAuth.auth.signOut()
       .then(() => {
         this.router.navigate(['/'])
       })
   }

   private updateUserData(user) {
     const userRef: AngularFirestoreDocument < User > =
       this.afs.doc(`users/${user.uid}`)
     const data: User = {
       uid: user.uid,
       email: user.email || null,
       displayName: user.displayName,
       photoURL: user.photoURL
     }
     return userRef.set(data, {
       merge: true
     })
   }
 }

我只需要摆脱错误,因此将来不会让我失望。万一将来数据库发生问题,我也要学习如何解决这类问题。

输入新的用户电子邮件和有效密码后,firebase会注册更改并将其存储在其数据库中,但由于某种原因,我会收到此讨厌的错误,而且我不喜欢看到带有红色下划线的代码。

几乎为我创建的应用程序的注册页面提供了功能。

感谢您的任何帮助。

1 个答案:

答案 0 :(得分:0)

您的const data不是Firebase提供的User类型的接口。您可以检查源代码中的firebase User界面,其中包括错误提示之类的属性,或从官方 documentation 中读取。

您要使用自己创建的界面,即user

const data: user = {
  uid: user.uid,
  email: user.email || null,
  displayName: user.displayName,
  photoURL: user.photoURL
}

这意味着您想要的文档也属于user类型:

const userRef: AngularFirestoreDocument<user> = this.afs.doc(`users/${user.uid}`);

您还需要从注册中返回的是user.user

return this.afAuth.auth.createUserWithEmailAndPassword(email, password)
  .then(user => this.updateUserData(user.user))

由于createUserWithEmailAndPassword返回promise of UserCredential

我发现您在其他地方使用User作为类型,因此,如果遇到其他类似问题的地方,则可能是相同原因造成的。

我要补充一点,firebase.User是哪个用户?好吧,那是您从以下位置返回的用户:

this.afAuth.auth.currentUser