gpt4 book ai didi

angular - 如何在 HttpInterceptor 中使用 NGXS 存储中的值?

转载 作者:行者123 更新时间:2023-12-03 21:22:57 25 4
gpt4 key购买 nike

我对 Angular 很陌生。我正在使用带有 NGXS 的 Angular 6 进行状态管理。

我的 NGXS 商店有一个 user reducer 的接口(interface)是

/* src/app/store/models/user.model.ts */
export interface User {
serverToken? : string;
// and other unrelated stuff
}

我想使用 serverTokenAuthorization HttpInterceptor 中的标题.

这是我目前的 HttpInterceptor代码

import {Store, Select} from '@ngxs/store';
import {Injectable} from '@angular/core';
import {HttpInterceptor, HttpHandler, HttpRequest, HttpEvent} from '@angular/common/http';

import {Observable} from 'rxjs';
import {User} from '../store/models/user.model';

@Injectable()
export class ApiInterceptor implements HttpInterceptor {
constructor(private store : Store) {}
@Select()user$ : Observable < User >;

intercept(req : HttpRequest < any >, next : HttpHandler) : Observable < HttpEvent < any >> {
let options = {
url: `https://base-url.com/api/${req.url}`
};

const serverToken = '???';
if (serverToken) // if not empty
options = {
...options,
headers: req
.headers
.set('Authorization', `JWT ${serverToken}`)
}

const duplicate = req.clone(options);

return next.handle(duplicate);
}
}

所以我的问题是: 如何正确优雅地使用user$可观察得到 serverToken并在 HttpInterceptor 中使用它如果 serverToken是不是空的?

最佳答案

如果您更喜欢更“可观察”的方法,请尝试以下方法:

intercept(req : HttpRequest < any >, next : HttpHandler) : Observable < HttpEvent < any >> {

return this.serverToken$.pipe(
take(1),
concatMap(serverToken => {
if (serverToken) {
options = {
...options,
headers: req.headers.set('Authorization', `JWT ${serverToken}`)
}
const duplicate = req.clone(options);
return next.handle(duplicate)
} else {
// next() without changing req
return next(req)
}
}
)
}

您还需要定义 @Selector返回用户 token 和 @Select它来自拦截器类。

注意:我不熟悉 HTTP 拦截器,只是根据我在 intercept() 的签名中看到的内容应用链接 RxJS 可观察对象的概念。 .

关于angular - 如何在 HttpInterceptor 中使用 NGXS 存储中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51372130/

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