Объект, переданный в реализацию `selectId`, вернулся неопределенным

#javascript #angular #typescript #ngrx #ngrx-entity

#javascript #angular #typescript #ngrx #ngrx-объект

Вопрос:

я хочу установить токен и обновить токен в ngrx и сохранять и использовать это для каждого запроса, а при перезагрузке страницы не удалять данные в redux.

я реализую это состояние для этого :

я отправляю данные :

             this.getUserInformation().toPromise().then(responset => {
            if (response.success === true) {
                this.store.dispatch(new SetUserInformation({
                    displayName: responset['result']['displayName'],
                    userInfo: responset.result.claims,
                    RefreshTokenStatus:false,
                    accessToken:response['result']['access_token'],
                    refreshToken:response['result']['refresh_token']
                }))
            }
        });
  

в модуле я определяю хранилище :

     StoreModule.forFeature('Information', 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.UserInformation:
            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>('Information');


export const getAccessToken=createSelector(
    getTokenFetureState,
    state => state.accessToken
)
  

это действие :

    export class SetUserInformation implements Action {
    readonly type = TokenActionTypes.UserInformation;

    constructor(public payload: TokenState) {
    }
}

export type TokenAction = SetUserInformation
  

теперь у меня проблема с буксировкой :

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

A: когда я хочу получить токен для использования, он возвращает null и показывает мне эту ошибку :

@ngrx/entity: объект, переданный в selectId реализацию, вернулся неопределенным. Вероятно, вам следует предоставить свою собственную selectId реализацию. Объект, который был передан: Объект selectId реализации: (экземпляр) => instance.id

B: при перезагрузке страницы данные удаляются из ngrx.

как я могу решить эту проблему?

введите описание изображения здесь

Ответ №1:

Вы используете ngrx/entity для данных, не являющихся объектами. Объект предназначен для работы с массивами данных, где каждый элемент имеет какой-то уникальный идентификатор. Вот почему он выдает ошибку: вы передаете ему данные, не совместимые с объектом. Вам нужно написать простой редуктор, который просто устанавливает состояние, а не тот, который пытается добавить данные в несуществующий объект.

Что касается перезагрузки страницы, NgRx всегда сбрасывает данные, это ожидаемое поведение. Вам необходимо реализовать localStorage сохранение, если вы хотите сохранять данные с течением времени.