J'essaie de configurer Firebase sur mon Ionic Angular project. J'utilise le tutoriel lié https://www.positronx.io/ionic-firebase-authentication-tutorial-with-examples / pour ce faire. Je continue à faire face à une erreur TS2570: la propriété 'sendEmailVerification' n'existe pas sur le type 'Promise'. Avez-vous oublié d'utiliser 'await'?
J'ai joint mon code. La seule chose importante que j'ai changée est qu'AngularFire a changé la façon dont auth est utilisé dans 6.0.0
import { Injectable, NgZone } from '@angular/core';
import { auth } from 'firebase/app';
import { User } from "./user";
import { Router } from "@angular/router";
import { AngularFireAuth } from "@angular/fire/auth";
import { AngularFirestore, AngularFirestoreDocument } from '@angular/fire/firestore';
@Injectable({
providedIn: 'root'
})
export class AuthenticationService {
userData: any;
constructor(
public afStore: AngularFirestore,
public ngFireAuth: AngularFireAuth,
public router: Router,
public ngZone: NgZone
) {
this.ngFireAuth.authState.subscribe(user => {
if (user) {
this.userData = user;
localStorage.setItem('user', JSON.stringify(this.userData));
JSON.parse(localStorage.getItem('user'));
} else {
localStorage.setItem('user', null);
JSON.parse(localStorage.getItem('user'));
}
})
}
// Login in with email/password
SignIn(email, password) {
return this.ngFireAuth.signInWithEmailAndPassword(email, password)
}
// Register user with email/password
RegisterUser(email, password) {
return this.ngFireAuth.createUserWithEmailAndPassword(email, password)
}
// Email verification when new user register
SendVerificationMail() {
return this.ngFireAuth.currentUser.sendEmailVerification()
.then(() => {
this.router.navigate(['verify-email']);
})
}
// Recover password
PasswordRecover(passwordResetEmail) {
return this.ngFireAuth.sendPasswordResetEmail(passwordResetEmail)
.then(() => {
window.alert('Password reset email has been sent, please check your inbox.');
}).catch((error) => {
window.alert(error)
})
}
// Returns true when user is looged in
get isLoggedIn(): boolean {
const user = JSON.parse(localStorage.getItem('user'));
return (user !== null && user.emailVerified !== false) ? true : false;
}
// Returns true when user's email is verified
get isEmailVerified(): boolean {
const user = JSON.parse(localStorage.getItem('user'));
return (user.emailVerified !== false) ? true : false;
}
// Sign in with Gmail
GoogleAuth() {
return this.AuthLogin(new auth.GoogleAuthProvider());
}
// Auth providers
AuthLogin(provider) {
return this.ngFireAuth.signInWithPopup(provider)
.then((result) => {
this.ngZone.run(() => {
this.router.navigate(['dashboard']);
})
this.SetUserData(result.user);
}).catch((error) => {
window.alert(error)
})
}
// Store user in localStorage
SetUserData(user) {
const userRef: AngularFirestoreDocument<any> = this.afStore.doc(`users/${user.uid}`);
const userData: User = {
uid: user.uid,
email: user.email,
displayName: user.displayName,
photoURL: user.photoURL,
emailVerified: user.emailVerified
}
return userRef.set(userData, {
merge: true
})
}
// Sign-out
SignOut() {
return this.ngFireAuth.signOut().then(() => {
localStorage.removeItem('user');
this.router.navigate(['login']);
})
}
}
Le seul moment où il est appelé est dans les pages d'inscription ici
signUp(email, password){
this.authService.RegisterUser(email.value, password.value)
.then((res) => {
// Do something here
this.authService.SendVerificationMail()
this.router.navigate(['verify-email']);
}).catch((error) => {
window.alert(error.message)
})
}
}
Voici les dépendances utilisées dans le projet:
"@angular/common": "~8.2.14",
"@angular/core": "~8.2.14",
"@angular/fire": "^6.0.0",
"@angular/forms": "~8.2.14",
"@angular/platform-browser": "~8.2.14",
"@angular/platform-browser-dynamic": "~8.2.14",
"@angular/router": "~8.2.14",
"@capacitor/cli": "^2.0.1",
"@capacitor/core": "^2.0.1",
"@capacitor/ios": "^2.0.1",
"@ionic-native/core": "^5.0.7",
"@ionic-native/splash-screen": "^5.0.0",
"@ionic-native/status-bar": "^5.0.0",
"@ionic/angular": "^5.0.0",
"core-js": "^2.5.4",
"firebase": "^7.14.0",
"rxjs": "~6.5.1",
"tslib": "^1.9.0",
"zone.js": "~0.9.1"
Si quelqu'un peut me donner des conseils sur la façon de résoudre ce problème? Je ne suis pas sûr à 100% de la façon d'implémenter l'async et d'attendre la fonction sans afficher plus d'erreurs.
Je pense que vous devriez déplacer le .then
fonction de rappel au composant, comme dans le service, vous renvoyez le promise
dans le service
// Email verification when new user register
SendVerificationMail() {
return this.ngFireAuth.currentUser.sendEmailVerification()
}
et dans le composant
signUp(email, password){
this.authService.RegisterUser(email.value, password.value)
.then((res) => {
// Do something here
this.authService.SendVerificationMail()
.then(() => {
this.router.navigate(['verify-email']);
})
}).catch((error) => {
window.alert(error.message)
})
}
Mettre à jour
vous pouvez tout laisser tel quel, et ajouter async/await à la fonction appelante dans le composant non dans le service
composant
async signUp(email, password){
this.authService.RegisterUser(email.value, password.value)
.then((res) => {
// Do something here
await this.authService.SendVerificationMail()
this.router.navigate(['verify-email']);
}).catch((error) => {
window.alert(error.message)
})
}
un service
// Email verification when new user register
SendVerificationMail() {
return this.ngFireAuth.currentUser.sendEmailVerification()
.then(() => {
this.router.navigate(['verify-email']);
})
}