我努力在TypeScript&中实现一个功能。 RxJs从后端返回Observable数据。我需要根据用户角色查询不同的端点。我使用angular-JWT进行身份验证。我有两个问题:
目前代码编译得很好,但第二对请求一直被取消。为什么呢?
有没有比zip + throw + catch更好的方法呢?我一直在搜索rxjs文档,但一无所获。
代码:
public getData(): Observable<Data> {
return Observable.zip(
this.userService.getCurrentUser(),
this.authHttp.get(this.adminUrl),
(user, adminResponse) => {
if (user.role == 'admin') {
return adminResponse.json() as BackendResponse
} else {
throw "You are not an admin";
}
})
.catch(error => {
return Observable.zip(
this.userService.getCurrentUser(),
this.authHttp.get(this.normalUrl),
(user, normalResponse) => {
if (user.role == 'normal') {
return normalResponse.json() as BackendResponse
} else {
throw "You are not allowed to get this resource";
}
})
})
.catch(error => {
return Observable.throw(error)
});
}
管理端点为管理员和普通用户返回一些数据(在我的项目中是必需的),但如果标准用户查询其特殊API,则可以获得更多数据。
答案 0 :(得分:0)
这样的事情会起作用。我们有一个第一个可观察的用户$返回有关用户的数据,标志是用户是管理员。第二个observable auth $使用此信息创建一个具有正确路径和zip的请求,该请求从两个observable中获取数据并将它们组合起来。
const user$ = Observable.of({name:'julia', isAdmin})
.publishLast()
.refCount();
const auth$ = user$
.switchMap(user =>
Observable.of(`${this.baseurl}${user.isAdmin ? 'adminPath'
:'normalpath'}`));
Observable.zip(user$, auth$,
(x,y) => `user is ${JSON.stringify(x)} and auth is ${y}`)
.subscribe(result => this.result = result);
}
答案 1 :(得分:0)
检查用户是否处于正确的角色,如果不是,则抛出客户端异常是绝对错误的。如果您的服务器允许访问成功,那么您就会遇到严重的安全漏洞。如果您的服务器正确阻止了访问,那么您的所有检查都会让您感到困惑和毫无意义。
此外,捕获和重新抛出这样的异常是完全没有意义的,并导致冗余和错综复杂的代码。只是让错误浮出水面。
鉴于此,您应该需要的只是
export default class {
constructor(readonly authHttp: AuthHttp) { }
get urls() {
return {
admin: this.adminUrl,
normal: this.normalUrl
};
}
getData(): Observable<BackendResponse> {
return this.userService.getCurrentUser()
.flatMap(user => this.authHttp.get(this.urls[user.role]))
.map(response => response.json() as BackendResponse);
}
}