Teo*_*rov 6 interceptor observable angular
我有一个拦截器,在标头中添加一个标记.但是,如果我在POST请求后使用它,则不会触发订阅中的Observer.
拦截器:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.authService = this.inj.get(AuthService);
if (!this.authService.isLoggedIn()) {
return next.handle(req);
}
const changedReq = req.clone({headers: req.headers.set('Authorization', `Bearer ${this.authService.getToken()}`)});
return next.handle(changedReq);
}
Run Code Online (Sandbox Code Playgroud)
服务:
saveBeer(beerForm: BeerForm): Observable<Response> {
let body = JSON.stringify(beerForm);
let headers = new HttpHeaders({
'Content-Type': 'application/json'
});
return this.http.post(this.apiUrl, body, {headers: headers});
}
Run Code Online (Sandbox Code Playgroud)
零件:
onSubmitCreateBeer(): void {
this.beerService.saveBeer(this.beerForm)
.takeUntil(this.ngUnsubscribe)
.subscribe(
(response: Response) => {
// On response
this.router.navigate(['/beers']);
}, error => {
// On error
}, () => {
// On complete
});
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,响应永远不会被触发,所以我的导航步骤不起作用.如果我禁用拦截器一切正常.
有任何想法吗?
Teo*_*rov 16
我搞定了.问题是我的观察者在回应中期待json.然而,在我得到200 OK之后,响应中没有任何内容.这是一个错误,因此调用了错误函数.
解决方案1是设置responseType:text.
saveBeer(beerForm: BeerForm): Observable<any> {
let body = JSON.stringify(beerForm);
let headers = new HttpHeaders({
'Content-Type': 'application/json'
});
return this.http.post(this.apiUrl, body, {headers: headers, responseType: 'text'});
}
Run Code Online (Sandbox Code Playgroud)
解决方案2是从后端返回204.
两者现在都工作正常.有关于此的错误报告:
https://github.com/angular/angular/issues/18680
| 归档时间: |
|
| 查看次数: |
8843 次 |
| 最近记录: |