web-dev-qa-db-ja.com

Angular 8エラーなしで空白ページを表示

JWTトークン認証を使用して.Net Core Rest APIにログインするAngular 8アプリケーションを開発しています。

アプリケーションを起動すると、アプリケーションはエラーなしで正常にコンパイルされます。しかし、 http:// localhost:42 を開くと、空白のページが表示されます。

これがapp-routing.module.tsファイルです。

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login';
import { HomeComponent } from './home';
import { AppComponent } from './app.component';
import { AuthGuard } from './_helpers';

const routes: Routes = [
  {path: '',component:AppComponent,canActivate: [AuthGuard]},
  {path:'login',component:LoginComponent},
  {path: '**',redirectTo:''}
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

これがapp.component.tsファイルです。

import { Component ,ViewChild,OnInit } from '@angular/core';
import { ApiService } from './api.service';
import { Router } from '@angular/router';
import {Sort} from '@angular/material';
import { Log } from './log';
import {MatPaginator,MatSort,MatTableDataSource} from '@angular/material';

import { AuthenticationService } from './_services';
import { User } from './_models';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent{
  currentUser: User;
  public isViewable:boolean;

  constructor(private apiService: ApiService,private router: Router,private authenticationService: AuthenticationService){
    this.authenticationService.currentUser.subscribe(x => this.currentUser = x);
  }

  dataSource=new MatTableDataSource<Log>();
  displayedColumns: string[] = ['message','create_Date','log_Type'];

  @ViewChild(MatSort,{static:true}) sort: MatSort;

  ngOnInit(){
    this.dataSource.sort=this.sort;

    this.apiService.getLogs().subscribe((res)=>{
      this.dataSource.data=res;    
    });
   }


   public onSortData(sort:Sort){
    let data=this.dataSource.data.slice();
    if(sort.active && sort.direction!==''){
      data=data.sort((a:Log,b:Log)=>{
          const isAsc=sort.direction==='asc';
          switch(sort.active){
            case 'message': return this.compare(a.message,b.message,isAsc);
            case 'create_Date':return this.compare(a.create_Date,b.create_Date,isAsc);
            case 'log_Type':return this.compare(a.log_Type,b.log_Type,isAsc);
            default: return 0;
          }
      });    
    }
    this.dataSource.data=data; 
   }

   private compare(a,b,isAsc){
    return (a.toLowerCase() < b.toLowerCase()  ? -1 : 1) * (isAsc ? 1:-1);
   }

  public toggle():void{
    this.isViewable=!this.isViewable;

    this.apiService.getLogs().subscribe((res)=>{
      this.dataSource.data=res;
     });

    }

    logout() {
      this.authenticationService.logout();
      this.router.navigate(['/login']);
    }
  }

これがlogin.component.tsファイルです。

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { first } from 'rxjs/operators';

import { AuthenticationService } from '../_services';

@Component({ templateUrl: 'login.component.html' })
export class LoginComponent implements OnInit {
    loginForm: FormGroup;
    loading = false;
    submitted = false;
    returnUrl: string;
    error = '';

    constructor(
        private formBuilder: FormBuilder,
        private route: ActivatedRoute,
        private router: Router,
        private authenticationService: AuthenticationService
    ) { 
        // redirect to home if already logged in
        if (this.authenticationService.currentUserValue) { 
            this.router.navigate(['/']);
        }
    }

    ngOnInit() {
        this.loginForm = this.formBuilder.group({
            username: ['', Validators.required],
            password: ['', Validators.required]
        });

        // get return url from route parameters or default to '/'
        this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
    }

    // convenience getter for easy access to form fields
    get f() { return this.loginForm.controls; }

    onSubmit() {
        this.submitted = true;

        // stop here if form is invalid
        if (this.loginForm.invalid) {
            return;
        }

        this.loading = true;
        this.authenticationService.login(this.f.username.value, this.f.password.value)
            .pipe(first())
            .subscribe(
                data => {
                    this.router.navigate([this.returnUrl]);
                },
                error => {
                    this.error = error;
                    this.loading = false;
                });
    }
}

編集:

これがauth.guard.tsファイルです。

import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

import { AuthenticationService } from '../_services';

@Injectable({ providedIn: 'root' })
export class AuthGuard implements CanActivate {
    constructor(
        private router: Router,
        private authenticationService: AuthenticationService
    ) { }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        const currentUser = this.authenticationService.currentUserValue;
        if (currentUser) {
            // logged in so return true
            return true;
        }

        // not logged in so redirect to login page with the return url
        this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
        return false;
    }
}

ログインページが表示されることを期待していますが、ng serveと入力して開いた後、空白のページが表示されます http:// localhost:42

6
freelancer86

chromeブラウザ、chromeバージョンを更新した後、ブラウザで同じ問題が修正されました。ブラウザに関連するこの問題を確認するには、 IEまたはSafariのような他のブラウザでのクロスチェック。

編集:これに加えて、Chromeの一部の拡張機能を無効にしてみてください。拡張機能を無効にしたら、必ずブラウザを再起動してください。動作したら、必要な拡張機能を有効にします。

0
Kishor K

この問題は、アプリケーションの開始時に実行されるコードのエラーに関連している可能性があります。これにはおそらく、あらゆる種類の認証モジュールの開始が含まれます。

app.module.tsおよびAPP_INITIALIZERなど、そこから呼び出されるすべてのものを確認/デバッグします。

0
Yuri

おそらく、サポートされていないバージョンのIEを使用していますか?

後でChromeを試してくださいIEまたはFirefoxなど。または、polyfills.tsでブラウザのポリフィルのコメントを外してください。

/** IE9, IE10 and IE11 requires all of the following polyfills. **/
import 'core-js/es6/array';
import 'core-js/es6/date';
import 'core-js/es6/function';
import 'core-js/es6/map';
import 'core-js/es6/math';
import 'core-js/es6/number';
import 'core-js/es6/object';
import 'core-js/es6/parse-float';
import 'core-js/es6/parse-int';
import 'core-js/es6/regexp';
import 'core-js/es6/set';
import 'core-js/es6/string';
import 'core-js/es6/symbol';
import 'core-js/es6/weak-map';
0
Robin Webb

私は同じ問題に直面しているので、ページを2回更新するだけで問題は解決しますが、angularが入力したルートが見つからない場合は、PageNotFoundComponentにリダイレクトできます。 、それで、コンポーネントPageNotFoundComponentを作成し、そのコンポーネントにリダイレクトします。指定したルート以外の他のすべてのルートでは処理しないからです。

 {path: '**',redirectTo:''} // instead of this 
 {path: '**', redirectTo:'PageNotFoundComponent'} // add this

または、routerConfigで{ useHash: true }を使用してこれを試すと、すべてのルートで#/loginが使用され、開発モードでのみ使用できます。公開する場合は、この構成を削除できます{ useHash: true }

@NgModule({
  imports: [
    ...
    ...
    RouterModule.forRoot(routes, { useHash: true })  // .../#/crisis-center/
  ],
  ...
})
export class AppModule { }
0

「AuthGuard」を確認してください。trueが返されるかどうかを確認してください。デフォルトのルートは保護されており、それがfalseを返した場合、ページが読み込まれないのはそのためだと思います。

0
Andrew Rayan