0

私はログインするためにsignInWithGoogleを使用しており、同時にそのユーザーがデータベースに存在するかどうかを確認しています。そうでない場合、ユーザー情報がデータベースに追加されています。firebaseデータベースで利用できるユーザーに応じてルートを変更する

ここでは、新規ユーザーの場合はsurveyページ、既存ユーザーの場合はprofileページに移動します。新しいユーザーの場合、ユーザー情報はデータベースに追加されますが、profileページにも移動します。新規ユーザーがsurveyページに移動します。

import { Component } from '@angular/core'; 
import { AngularFireAuth } from 'angularfire2/auth'; 
import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database'; 
import { Router } from '@angular/router'; 

export class LoginComponent { 

    users: FirebaseListObservable<User[]>; 

    constructor(
    private db: AngularFireDatabase, 
    public afAuth: AngularFireAuth, 
    private router: Router 
) { 
     this.users = this.db.list('/users') as FirebaseListObservable<User[]>; 
    } 

    signInWithGoogle() { 
     this.afAuth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()) 
     .then((data) => { 
      // Checking if the email exists in the database 
      this.users.subscribe(users => { 

      let exists = users.some(function(el) { 
       return el.email === data.user.email; 
      }); 

      // If email does not exists in the database i.e. New user 
      if(!exists) { 
      this.router.navigate(['/survey']); 
      this.users.push({ 
       email: data.user.email 
      }) 
      return false; 
     } 
     else { 
      // If user already exists 
      this.router.navigate(['/profile']); 
      return false; 
     } 
     }) 

    }) 
    } 
} 

助けていただければ幸いです。ありがとう

+0

で今

import {Injectable} from "@angular/core"; import {Resolve, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from "@angular/router"; import {Observable} from "rxjs"; import * as firebase from "firebase/app"; import {FirebaseListObservable} from "angularfire2/database/firebase_list_observable"; import {AngularFireDatabase} from "angularfire2/database/database"; import {AngularFireAuth} from "angularfire2/auth/auth"; import User = firebase.User; @Injectable() export class TestResolve implements Resolve<any> { users: FirebaseListObservable<User[]>; constructor(public afAuth: AngularFireAuth, private db: AngularFireDatabase, private router: Router , private localStorage : localStorage) { this.users = this.db.list('/users') as FirebaseListObservable<User[]>; } resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any>|Promise<any>|any { this.afAuth.authState.subscribe((data) => { if(data){ this.users.subscribe(users => { let exists = users.some(function (el) { return el.email === data.email; }); //If email does not exists in the database i.e. New user if (!exists) { this.localStorage.setItem("email",data.email); this.router.navigate(['/survey']); } else { // If user already exists this.router.navigate(['/profile']); } }); } }); } } 

あなたはありがとう@RahulSingh –

+0

をプロファイルするために他の行く調査にナビゲートしていない場合は、ルータの決意を利用すると、ユーザーが存在するかどうかをチェックたりすることはできませんあなたのコメントのために。この場合、ルータ解決を実装する方法を教えてください。 – surazzarus

+0

ファイアベース観測にプッシュしているときに、サブスクリプション全体が、ルートが役に立たない場合は全体を再レンダリングするので、ルータでも問題が見つかりませんでした。私はそれに取り組んで同じであなたを更新します –

答えて

0

私はそれが完全なproff解決策であるかどうかはわかりませんが、ここにあります。 ここでローカルストレージを利用する。

LOGIC

我々は、通常のサインインコンポーネントを示していない場合は、データが存在するかどうかを確認私たちにサインインしたとき。

ユーザーがSignInをクリックすると、データが取得され、Surveyコンポーネントにリダイレクトされていない場合にデータがUser Observableに存在するかどうかがチェックされ、リダイレクトする前に電子メールとしてブラウザlocalstorageに保存します。そこに調査物を置いて、コンポーネントが破壊されたときに、データがobservableに追加され、observableが再度解決を呼び出すと、彼はプロフィールページにリダイレクトされます。リダイレクトする必要はありません。

私は確かではありませんが、これはまともな仕事のように思えますし、調査の記入前にプロフィールページに行くこともできません。

コンポーネントとマークアップ

<button (click)="signInWithGoogle()">Sign in </button> 

export class TestComponent implements OnInit { 
    constructor(public afAuth: AngularFireAuth) { } 
    ngOnInit() { 

    } 
    signInWithGoogle() { 
    this.afAuth.auth.signInWithRedirect(new firebase.auth.GoogleAuthProvider()); 
    } 

ルーター解決。調査コンポーネント

export class SurveyComponent implementsOnDestroy{ 
    constructor(private db: AngularFireDatabase , private localStorage : localStorage) { } 
    ngOnDestroy(){ 

    this.db.list("/users").push({"email": this.localStorage.getItem("email")}); 
    } 

} 
関連する問題