传递给`selectId`实现的实体返回未定义

问题描述

我想在ngrx中设置令牌和刷新令牌,并为每个请求保存和使用令牌,并且在重新加载页面时,不要在redux删除数据。

我为此实现了这种状态:

我调度数据:

            this.getUser@R_797_4045@ion().toPromise().then(responset => {
            if (response.success === true) {
                this.store.dispatch(new SetUser@R_797_4045@ion({
                    displayName: responset['result']['displayName'],userInfo: responset.result.claims,RefreshTokenStatus:false,accesstoken:response['result']['access_token'],refreshToken:response['result']['refresh_token']
                }))
            }
        });

在我定义商店的模块中:

    StoreModule.forFeature('@R_797_4045@ion',reducer),EffectsModule.forFeature([])

这是我的减速器:

   const initialState = adapter.getinitialState({
    accesstoken: null,refreshToken: null,RefreshTokenStatus: false,userInfo: null,displayName: null
})

export function reducer(state = initialState,action: TokenAction): TokenState {

    switch (action.type) {
        case TokenActionTypes.User@R_797_4045@ion:
            return adapter.addOne(action.payload,state)
        default:
            return state;
    }
}

这是我的模特:

  export interface TokenState {
    accesstoken: string;
    refreshToken: string;
    RefreshTokenStatus: boolean;
    userInfo: string[];
    displayName: string;
}

这是我的Selector

export interface State extends fromState.State,EntityState<TokenState> {
    UserInfo: TokenState;
}

export const adapter: EntityAdapter<TokenState> = createEntityAdapter<TokenState>();
const getTokenFetureState = createFeatureSelector<TokenState>('@R_797_4045@ion');


export const getAccesstoken=createSelector(
    getTokenFetureState,state => state.accesstoken
)

这是动作:

   export class SetUser@R_797_4045@ion implements Action {
    readonly type = TokenActionTypes.User@R_797_4045@ion;

    constructor(public payload: TokenState) {
    }
}

export type TokenAction = SetUser@R_797_4045@ion

现在我有拖曳问题:

 this.store.pipe(select(fromTokenSelect.getAccesstoken)).subscribe(data=>{
     console.log(data)
 })

A:当我想获取要使用的令牌时,它返回null并显示错误

@ ngrx / entity:传递给selectId实现的实体未定义返回。您可能应该提供自己的selectId实现。传递的实体:对象selectId实现:(实例)=> instance.id

B:重新加载页面时,它将从ngrx中删除数据。

我该如何解决这个问题?

enter image description here

解决方法

您将ngrx/entity用于非实体数据。实体设计用于处理数据数组,其中每个元素都有某种唯一的标识符。这就是它引发错误的原因:您正在向它提供非实体兼容的数据。您需要编写一个简单的reducer来简单地设置状态,而不是试图将数据添加到不存在的实体中。

对于页面重新加载,NgRx将始终重置数据,这是预期的行为。如果要随着时间的推移保留数据,则需要实施localStorage保存。