gpt4 book ai didi

angular - 在 Angular HttpClient 拦截器中使用 promise

转载 作者:太空狗 更新时间:2023-10-29 16:56:00 25 4
gpt4 key购买 nike

我可以在 HttpInterceptor 中使用 promise 吗?例如:

export class AuthInterceptor implements HttpInterceptor{
this.someService.someFunction()
.then((data)=>{
//do something with data and then
return next.handle(req);
});
}

为什么我需要这个?因为在向服务器发出请求之前,我需要获取一个 token 以添加到请求 header 中。

我的拦截器:

@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;
});
}
}

要求:

this.http.post(this.baseURL + 'hero', data)
.subscribe(
(res: any) => {
console.log('Saved Successfully.');
console.log(res);
},
(err: any) => {
console.log('Save Error.' + err);
}
);

我遇到的问题:

->我在 promise 解决之前收到此错误。

You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

Promise resloves,我得到了我的 token ,但是在错误之后。

最佳答案

更新:使用 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);
})
);
}
}

原始答案

是的,您可以将所需的服务注入(inject)到拦截器的构造方法中,并在 intercept 的实现中检索值,创建一个新的更新的 http 请求并处理它。

我不擅长 promise ,所以你可以尝试以下方法:

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);
});
}
}

关于angular - 在 Angular HttpClient 拦截器中使用 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45978813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com