[解決済み] Angular2 canActivate() 非同期関数呼び出し
2023-01-26 01:46:47
質問
Angular2のルーターガードを使って、アプリ内のいくつかのページへのアクセスを制限しようとしています。 私はFirebase Authenticationを使用しています。 ユーザーがFirebaseでログインしているかどうかを確認するために、私は以下を呼び出す必要があります。
.subscribe()
を呼び出す必要があります。
FirebaseAuth
オブジェクトをコールバックで返します。 これはガードのためのコードです。
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AngularFireAuth } from "angularfire2/angularfire2";
import { Injectable } from "@angular/core";
import { Observable } from "rxjs/Rx";
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private auth: AngularFireAuth, private router: Router) {}
canActivate(route:ActivatedRouteSnapshot, state:RouterStateSnapshot):Observable<boolean>|boolean {
this.auth.subscribe((auth) => {
if (auth) {
console.log('authenticated');
return true;
}
console.log('not authenticated');
this.router.navigateByUrl('/login');
return false;
});
}
}
ガードのあるページに移動したとき、どちらかの
authenticated
または
not authenticated
がコンソールに出力されます (firebaseからの応答を待つのに若干の時間がかかった後)。 しかし、ナビゲーションが完了することはありません。 また、ログインしていない場合、リダイレクトで
/login
ルートにリダイレクトされます。 つまり、私が抱えている問題は
return true
がユーザーに要求されたページを表示しないことです。 私はこれがコールバックを使用しているためであると仮定していますが、私はそれを行う方法を見つけることができません。 何か考えがありますか?
どのように解決するのですか?
canActivate
を返す必要があります。
Observable
を返す必要があります。
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private auth: AngularFireAuth, private router: Router) {}
canActivate(route:ActivatedRouteSnapshot, state:RouterStateSnapshot):Observable<boolean>|boolean {
return this.auth.map((auth) => {
if (auth) {
console.log('authenticated');
return true;
}
console.log('not authenticated');
this.router.navigateByUrl('/login');
return false;
}).first(); // this might not be necessary - ensure `first` is imported if you use it
}
}
があり
return
が抜けているので
map()
の代わりに
subscribe()
というのは
subscribe()
は
Subscription
ではなく
Observable
関連
-
[解決済み] describe'という名前が見つかりません。テストランナー用の型定義をインストールする必要がありますか?
-
[解決済み] ts ES5/ES3の非同期関数やメソッドには、「Promise」コンストラクタが必要です。
-
[解決済み] tsc が `TS2307: Cannot find module` for a local file をスローします。
-
[解決済み] typescriptでmoment.jsをインポートするには?
-
[解決済み] tsconfigの "target "と "module "を理解する。
-
[解決済み] Angular 2 - ルーティング - ObservableでCanActivateする。
-
[解決済み] Angular2のhttpデータからRxJS ObservablesをTypeScriptで連鎖させる。
-
[解決済み] spec/testフォルダを使用したtsconfigのセットアップ
-
[解決済み] TypeScriptで単一のプロパティをオプションにする
-
[解決済み] クラス内列挙型(TypeScript定義ファイル)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 明示的なプロミス構築のアンチパターンとそれを回避する方法とは?
-
[解決済み] TypeScriptで Object.keys return string[].
-
[解決済み] TypeScriptの予約語 "type "とは何ですか?
-
[解決済み] Typescriptでインターフェースやクラスを使用する場合 [重複].
-
[解決済み] Typescript のプリミティブ型:"number" と "Number" の違い(TSC は大文字と小文字を区別しない)?
-
[解決済み] TypeScriptでObject.keysがkeyof型を返さないのはなぜですか?
-
[解決済み] エラー Typescript Feature 1.5。現在の言語レベルは1.4です。
-
[解決済み] Angular2のhttpデータからRxJS ObservablesをTypeScriptで連鎖させる。
-
[解決済み] spec/testフォルダを使用したtsconfigのセットアップ
-
[解決済み] Angular 2で相対パスが非常に長いインポートを回避する方法とは?