好的,所以我正在编写一个登录页面,这个页面应该根据用户属性'tag'('tag‘可以是'staff’或'admin')的值来理想地将用户引导到两个不同的主页中的一个( home -staff和home-manager),后者存储在firebase中的实时数据库中。因此,我需要检索该数据并检查该属性的值,并决定将其指向何处。
另外一件应该同时做的事情是,如果输入的电子邮件或密码不正确,或者用户没有帐户,就会发出警告信息。
我尝试将所有这些都合并到我的'login.ts‘页面中,我得到了一个运行时错误:'Firebase.child失败:第一个参数是无效路径:’(我的第一个参数是user.email) --这是我的代码。请帮帮忙
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { SignupPage } from '../signup/signup';
import { AngularFireDatabase,FirebaseListObservable } from 'angularfire2/database';
import { AngularFireAuth } from 'angularfire2/auth';
import { HomeManagerPage } from '../home-manager/home-manager';
import { HomeStaffPage } from '../home-staff/home-staff';
import { User } from '../../models/user';
import * as firebase from 'firebase';
@Component({
selector: 'page-login',
templateUrl: 'login.html'
})
export class LoginPage {
user= {} as User;
public fireAuth: any;
public userProfile: any;
public userTag: any;
public t: any;
constructor(public navCtrl: NavController,public angfire:AngularFireAuth)
{
this.fireAuth=firebase.auth();
this.userProfile=firebase.database().ref('users');
}
viewUser(userEmail: any)
{
var userRef= this.userProfile.child(userEmail);
return userRef.once('value');
}
goToSignup(params)
{
if (!params) params = {};
this.navCtrl.push(SignupPage);
}
goToLogin(params)
{
if (!params) params = {};
this.navCtrl.push(LoginPage);
}
displayUser(theUserEmail)
{
var that=this;
this.viewUser(theUserEmail).then(snapshot=>
{
that.userTag=snapshot.val().tag;
})
return this.userTag;
}
async login(user:User)
{
this.angfire.auth.signInWithEmailAndPassword(user.email,user.password)
.then(user => {
this.t=this.displayUser(user.email);
if(this.t=='staff'){this.navCtrl.setRoot(HomeStaffPage);}
else{this.navCtrl.setRoot(HomeManagerPage);}
}, err => {
let msg;
switch (err['code'])
{
// SWITCH THE CODE RETURNED TO SEE WHAT MESSAGE YOU'LL DISPLAY
case "auth/wrong-password":
msg= "Email or Password is wrong.";
break;
case "auth/user-not-found":
msg= 'User not found.';
break;
case "auth/invalid-email":
msg= 'Email or Password is wrong.';
break;
}
alert(msg);
});//.then ends here
}
}
发布于 2017-06-20 12:24:05
只有两件事:
我认为你必须为这样简单的事情编写大量的代码,我们可以减少它。
2-当用户创建一个帐户时,我高度支持您将用户保存在它创建的uuid中,这是safier。所以你会有这样的结构
Your_BD
|_ users
|_ user_uuid
|_ email: email
|_ tag: tag所以您需要做的是:Login > get user email > get the user node > get tag,问题是角(或者TS,我忘了是谁,对不起)是非阻塞的,所以它不会等待您的函数返回来检查标记并将用户发送到页面,所以使用firebase方法返回的承诺来操作要执行的内容并正确地执行代码。
在您的登录函数中,您可以这样做(我不会使用错误部分):
async login(user:User)
{
this.angfire.auth.signInWithEmailAndPassword(user.email,user.password)
.then(user => {
firebase.database().ref('users/' + user.email).once('value', snapshot =>{
if(snapshot.val().tag == 'staff'){
this.navCtrl.setRoot(HomeStaffPage);
} else {
this.navCtrl.setRoot(HomeManagerPage);
}
})
}, err =>{...})
}希望这能有所帮助。
https://stackoverflow.com/questions/44651251
复制相似问题