nig*_*f91 18 rxjs es6-promise angular angular-httpclient angular-httpclient-interceptors
我可以在内部使用诺言HttpInterceptor
吗?例如:
export class AuthInterceptor implements HttpInterceptor{
this.someService.someFunction()
.then((data)=>{
//do something with data and then
return next.handle(req);
});
}
Run Code Online (Sandbox Code Playgroud)
为什么我需要这个?因为我需要在向服务器发出请求之前获取一个令牌以添加到请求标头.
我的拦截器:
@Injectable()
export class AuthInterceptor implements HttpInterceptor{
constructor(private authService: AuthService){}
intercept(req: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>{
console.log('Intercepted!');
// return next.handle(req);
this.authService.getToken()
.then((token)=>{
console.log(token);
const reqClone = req.clone({
headers: req.headers
.set('Authorization', 'Bearer ' + token)
.append('Content-Type', 'application/json')
});
console.log(reqClone);
return next.handle(reqClone);
})
.catch((err)=>{
console.log('error in interceptor' + err);
return null;
});
}
}
Run Code Online (Sandbox Code Playgroud)
请求:
this.http.post(this.baseURL + 'hero', data)
.subscribe(
(res: any) => {
console.log('Saved Successfully.');
console.log(res);
},
(err: any) => {
console.log('Save Error.' + err);
}
);
Run Code Online (Sandbox Code Playgroud)
我面临的问题:
- >我在承诺解决之前得到了这个错误.
You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
Run Code Online (Sandbox Code Playgroud)
承诺resloves我得到我的令牌但错误后.
Jot*_*edo 30
更新:使用rxjs@6.x
import { from, Observable } from 'rxjs';
import { switchMap } from 'rxjs/operators';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private authService: AuthService){}
intercept(request: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>{
return from(this.authService.getToken())
.pipe(
switchMap(token => {
const headers = request.headers
.set('Authorization', 'Bearer ' + token)
.append('Content-Type', 'application/json');
const requestClone = request.clone({
headers
});
return next.handle(requestClone);
})
);
}
}
Run Code Online (Sandbox Code Playgroud)
原始答案
是的,您可以将所需的服务注入到拦截器的构造函数方法中,并在intercept
检索值的实现中,创建一个新的更新的http请求并处理它.
我对承诺不满意,所以你可以尝试以下方法:
import { fromPromise } from 'rxjs/observable/fromPromise';
@Injectable()
export class AuthInterceptor implements HttpInterceptor{
constructor(private authService: AuthService){}
intercept(req: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>{
return fromPromise(this.authService.getToken())
.switchMap(token => {
const headers = req.headers
.set('Authorization', 'Bearer ' + token)
.append('Content-Type', 'application/json');
const reqClone = req.clone({
headers
});
return next.handle(reqClone);
});
}
}
Run Code Online (Sandbox Code Playgroud)
对于RxJS 6+我更新了Jota.Toledo的答案:
import { fromPromise } from 'rxjs/observable/fromPromise';
@Injectable()
export class AuthInterceptor implements HttpInterceptor{
constructor(private authService: AuthService){}
intercept(req: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>{
return fromPromise(this.authService.getToken())
.pipe(switchMap(token => {
const headers = req.headers
.set('Authorization', 'Bearer ' + token)
.append('Content-Type', 'application/json');
const reqClone = req.clone({
headers
});
return next.handle(reqClone);
}));
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6401 次 |
最近记录: |