因此,我正在尝试为应用创建注册表单,除了它引发错误外,其他所有功能似乎都正常运行。 数据似乎出现在我的数据库中,但是当我尝试“ 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会注册更改并将其存储在其数据库中,但由于某种原因,我会收到此讨厌的错误,而且我不喜欢看到带有红色下划线的代码。
几乎为我创建的应用程序的注册页面提供了功能。
感谢您的任何帮助。
答案 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