我正在开发一个Angular 8应用程序,它将使用JWT令牌身份验证登录到.Net Core Rest API。
启动应用程序时,应用程序可以成功编译且没有错误。但是,当我打开localhost:4200时,会出现空白页面。
这是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”并打开localhost:4200后出现空白页面
答案 0 :(得分:1)
1.-打开标签。检查html文件中是否有正确关闭的标记。就我而言,问题是因为在一个组件中我有一个额外的</div>
。
2。-未声明的输入。检查是否要尝试传递未在组件中声明的输入,例如<app-component [var1]="123"> </app-component>
,在组件中必须必须将输入声明为@Input () var1;
3.-用于在某些html文件中将{{}}
打印为空的键
4.-带有角度标记的未声明属性。例如在{anyWord]不是有效条目的<input [anyWord]>
中
答案 1 :(得分:1)
此问题很可能与应用程序启动期间执行的代码错误有关。这很可能包括启动任何类型的身份验证模块。
检查/调试您的app.module.ts
以及从那里调用的所有内容-例如APP_INITIALIZER
。
答案 2 :(得分:0)
您认为缺少<router-outlet></router-outlet>
吗? (Documentation)
答案 3 :(得分:0)
也许您使用的是不受支持的IE版本?
尝试使用Chrome,更高版本的IE或Firefox等。或者,您也可以在polyfills.ts中取消对浏览器polyfill的注释。
/** 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';
答案 4 :(得分:0)
我遇到了同样的问题,因此我只刷新页面两次即可,但是可以尝试一下,
在您的路线中,如果angular找不到您在其上键入的任何路线,则应重定向至
PageNotFoundComponent
,因此请创建一个组件PageNotFoundComponent
并重定向到该组件,因为除了指定的路由外,您不处理其他所有路由
{path: '**',redirectTo:''} // instead of this
{path: '**', redirectTo:'PageNotFoundComponent'} // add this
或者您可以在routerConfig中使用{ useHash: true }
来尝试此操作,并且所有路由都将使用#/login
,并且可以将其仅用于开发模式,并且要发布时,可以删除此配置{{1} }
{ useHash: true }
答案 5 :(得分:0)
请检查您的“ AuthGuard”。检查其是否返回true。由于您的默认根目录已受到保护,并且如果它返回false,那么我认为这就是为什么您的页面未加载的原因。
答案 6 :(得分:0)
最近,在更新chrome版本后,我在chrome浏览器中遇到了相同的问题,此问题已解决。 您可以通过交叉检查其他浏览器(例如IE或Safari)来验证是否与浏览器相关的问题。
编辑:除此之外,请尝试禁用chrome中的某些扩展程序。禁用扩展程序后,请确保重新启动浏览器。一旦运行,请启用所需的扩展名。
答案 7 :(得分:0)
好吧,这只是发生在我身上,可能会帮助其他人:
$ ng add @nestjs/ng-universal
document.addEventListener('DOMContentLoaded', () => {
document.addEventListener('DOMContentLoaded', () => {
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
});
});
这给我一个运行$ ng serve
的空白页面,没有错误,没有消息,没有任何内容,只是一个白色且令人讨厌的页面。
删除document.addEventListener( ...
个包装器之一后,它就起作用了!
答案 8 :(得分:0)
检查浏览器控制台,通常,错误在那里显示。如果您的代码有错误,则会在其中显示。
答案 9 :(得分:0)
就我而言,我只是将文件命名为app.routing.ts
而不是app-routing.module.ts
。通过修复它起作用。
答案 10 :(得分:0)
我的代码的问题是我按原样使用了 keycloak 安装配置对象 即
{
"realm": "demo",
"auth-server-url": "http://localhost:8180/auth/",
"ssl-required": "external",
"resource": "local",
"public-client": true,
"confidential-port": 0,
"clientId": "local"
}
但它是错误的,正确的如下:
{ url: "http://localhost:8180/auth/", 领域:“演示”, 客户端 ID:“本地” }