首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据用户所拥有的、存储在firebase数据库中的属性将用户引导到不同的主页?

如何根据用户所拥有的、存储在firebase数据库中的属性将用户引导到不同的主页?
EN

Stack Overflow用户
提问于 2017-06-20 11:02:30
回答 1查看 61关注 0票数 0

好的,所以我正在编写一个登录页面,这个页面应该根据用户属性'tag'('tag‘可以是'staff’或'admin')的值来理想地将用户引导到两个不同的主页中的一个( home -staff和home-manager),后者存储在firebase中的实时数据库中。因此,我需要检索该数据并检查该属性的值,并决定将其指向何处。

另外一件应该同时做的事情是,如果输入的电子邮件或密码不正确,或者用户没有帐户,就会发出警告信息。

我尝试将所有这些都合并到我的'login.ts‘页面中,我得到了一个运行时错误:'Firebase.child失败:第一个参数是无效路径:’(我的第一个参数是user.email) --这是我的代码。请帮帮忙

代码语言:javascript
复制
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
  }
  
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-20 12:24:05

只有两件事:

我认为你必须为这样简单的事情编写大量的代码,我们可以减少它。

2-当用户创建一个帐户时,我高度支持您将用户保存在它创建的uuid中,这是safier。所以你会有这样的结构

代码语言:javascript
复制
Your_BD
|_ users
   |_ user_uuid
      |_ email: email
      |_ tag: tag

所以您需要做的是:Login > get user email > get the user node > get tag,问题是角(或者TS,我忘了是谁,对不起)是非阻塞的,所以它不会等待您的函数返回来检查标记并将用户发送到页面,所以使用firebase方法返回的承诺来操作要执行的内容并正确地执行代码。

在您的登录函数中,您可以这样做(我不会使用错误部分):

代码语言:javascript
复制
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 =>{...})
}

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44651251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档