В приложении Angular 6 (и RxJS) у меня есть эффект, который управляет логином. Сначала он вызывает сервер, а затем устанавливает и декодирует токен. В конце я добавил последнюю операцию, которая обрабатывает перенаправление.
Это так: пользователь (не авторизованный) пытается получить доступ на странице профиля. В AuthGuard перехватываю и сохраняю нужную страницу (auth-guard.service.ts):
.. Here I already know that the user is not authenticated.
let url = state.url;
if (url) {
.. I save in the Store the url
this.store.dispatch(new CoreActions.SaveRedirectUrl(url));
}
this.router.navigate(['/login']);
return false;
Это две последние части эффекта аутентификации (auth.effects.ts, вызываемого, когда я отправляю действие DO_LOGIN):
, mergeMap((tokenObj: any) => {
return [
{
type: AuthActions.LOGIN
},
{
type: AuthActions.SET_TOKEN,
payload: tokenObj.token
},
{
type: ProfileActions.DECODE_TOKEN,
payload: tokenObj.token
}
];
})
, exhaustMap(() => {
return this.store.select('core')
.pipe(
map(coreState => {
if (coreState.redirectUrl) {
this.router.navigate([coreState.redirectUrl]);
} else {
this.router.navigate(['/']);
}
new CoreActions.RemoveRedirectUrl();
}));
}),
Итак, я смотрю на это поведение: после того, как пользователь вошел в систему, я сохраняю токен, я (в конечном итоге) перенаправляю на нужную страницу, а затем удаляю эту страницу из состояния. Я уверен, что первая mergeMap () работает .. все было сломано, когда я добавил последний кусок (выхлопная карта), и я не могу найти решение для ошибки консоли:
ОШИБКА Ошибка: эффект «AuthEffects.authLogin $» отправил недопустимое действие: undefined
Если я изменю положение последнего «возврата»:
this.store.select('core') -----> from here
.pipe(
map(coreState => {
if (coreState.redirectUrl) {
this.router.navigate([coreState.redirectUrl]);
} else {
this.router.navigate(['/']);
}
return new CoreActions.RemoveRedirectUrl(); -----> to here
}));
У меня ошибка компиляции на excMap ():
Аргумент типа '() => void' не может быть назначен параметру типа '(значение: {type: string; payload ?: undefined;} | {type: string; payload: any;}, index: number) .. . '. Тип 'void' не может быть назначен типу 'ObservableInput ‹{}>'