gpt4 book ai didi

Angular 7 使用 NGRX 并将 token 保存在 localStorage 中

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

在我的 Angular 应用程序中,我使用了 NGRX 存储,但我在保存用户 token 时遇到了一些问题。
有时我重新加载我的页面并丢失了所有内容。

在 app.component.ts 中实现 OnInit 并在那里添加:

this.store.select('auth').subscribe(event => {
if (event.token) {
window.localStorage.setItem('token', JSON.stringify(event.token));
}
});

if (window.localStorage.getItem('token')) {
const token = JSON.parse(window.localStorage.getItem('token'));
this.store.dispatch(new AuthActions.SetToken(token));
}

并创建效果:
@Effect()
this.actions$.pipe(
ofType<AuthActions.TrySignin> (
AuthActions.AuthActionTypes.TRY_SIGNIN
),
switchMap(action => {
return this.httpClient.put('http://localhost:8080/api/signin', {
username: action.payload.username,
password: action.payload.password
}, {
observe: 'body',
responseType: 'text'
}).pipe(
map(
token => {
this.router.navigate(['/']);
return new AuthActions.SetToken(token);
}
),
catchError(error => {
return of(new AuthActions.AuthFailed(error));
}
)
);

}
)
);

它是正确的?

最佳答案

我建议您不要在组件中执行此操作。
它们将变得更难测试,而且您最终可能会在不同的组件中使用相同的代码。

相反,您可以按照 Maciej 的建议在内部效果中执行此操作,另一个示例参见 https://github.com/tomastrajan/angular-ngrx-material-starter/blob/master/src/app/examples/form/form.effects.ts#L20

但就我个人而言,我喜欢为此使用元 reducer - 参见 https://github.com/timdeschryver/ngrx-family-grocery-list/blob/master/src/app/groceries/reducers/groceries.reducer.ts#L165

例如:

export function persistStateReducer(_reducer: ActionReducer<State>) {
const localStorageKey = '__auth';
return (state: State | undefined, action: Action) => {
if (state === undefined) {
const persisted = localStorage.getItem(localStorageKey);
return persisted ? JSON.parse(persisted) : _reducer(state, action);
}

const nextState = _reducer(state, action);
localStorage.setItem(localStorageKey, JSON.stringify(nextState));
return nextState;
};
}

关于Angular 7 使用 NGRX 并将 token 保存在 localStorage 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53544978/

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