Angular 在第8页上,刷新页面不会';t显示来自后端api的数据
我从后端获取数据并将其显示在mat表中,该表在延迟加载模块内的组件上呈现。在我从浏览器刷新页面之前,一切似乎都很正常(或者在运行ng serve和编写代码时,它会自行刷新,顺便说一下,这就是我发现错误的原因) 刷新页面时,从API获取的数据不再显示。当从不同的页面导航时,它会工作 我在后端使用Django rest框架为angular客户端提供API。 我的应用程序在后端使用JWT对用户进行身份验证,在前端使用firebase对用户进行身份验证 我使用Http拦截器将JWT令牌添加到所有Http请求中 auth.service.ts以获取令牌Angular 在第8页上,刷新页面不会';t显示来自后端api的数据,angular,firebase,django-rest-framework,firebase-authentication,angular8,Angular,Firebase,Django Rest Framework,Firebase Authentication,Angular8,我从后端获取数据并将其显示在mat表中,该表在延迟加载模块内的组件上呈现。在我从浏览器刷新页面之前,一切似乎都很正常(或者在运行ng serve和编写代码时,它会自行刷新,顺便说一下,这就是我发现错误的原因) 刷新页面时,从API获取的数据不再显示。当从不同的页面导航时,它会工作 我在后端使用Django rest框架为angular客户端提供API。 我的应用程序在后端使用JWT对用户进行身份验证,在前端使用firebase对用户进行身份验证 我使用Http拦截器将JWT令牌添加到所有Http
getToken() {
let tokenPromise = new Promise ((resolve, reject) => {
this.afAuth.auth.onAuthStateChanged( user => {
if (user) {
this.afAuth.auth.currentUser.getIdToken()
.then(token => {
this.userToken = token;
});
}
if (this.userToken) {
resolve(this.userToken);
}
});
});
return tokenPromise;
}
api.service.ts发送http请求
public getEmployees(): Observable<Employee[]> {
return this.http.get<Employee[]>(`${this.url}/employee/`);
}
public getEmployees():可观察{
返回this.http.get(`${this.url}/employee/`);
}
token-interceptor.service.ts用于添加令牌
@Injectable({
providedIn: 'root'
})
export class TokenInterceptorService implements HttpInterceptor {
constructor(private authService: AuthService) { }
intercept(req, next): Observable<any> {
return from(this.authService.getToken()).pipe(
switchMap(token => {
const headers = req.headers
.set('Authorization', 'JWT ' + token)
.append('Content-Type', 'application/json');
const reqClone = req.clone({
headers
});
return next.handle(reqClone);
}));
}
}
@可注入({
providedIn:'根'
})
导出类TokenInterceptorService实现HttpInterceptor{
构造函数(私有authService:authService){}
截距(req,next):可观测{
从(this.authService.getToken()).pipe返回(
开关映射(令牌=>{
const headers=req.headers
.set('Authorization','JWT'+令牌)
.append('Content-Type','application/json');
const reqClone=req.clone({
标题
});
返回next.handle(reqClone);
}));
}
}
在Chrome浏览器开发者工具的“网络”选项卡上,我可以看到在正常导航下获取employee/但当浏览器刷新时,employee/不再存在。问题在于以下行: this.afAuth.auth.currentUser.getIdToken() currenUser可以为null,我们需要afAuth.authState 详细答案可在以下链接中找到:
在组件中如何/在何处触发加载员工列表?员工列表位于人力资源管理模块内,而人力资源管理模块是从仪表板模块延迟加载的。仪表板模块添加了导航组件,因此每个模块都将在其中,除了注册、登录等,它位于fireauth目录中,不需要导航组件。