В приложении 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 ( 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();
}));
}),
Итак, я смотрю на это поведение: после того, как пользователь вошел в систему, я сохраняю токен, я (в конце концов) перенаправляю на нужную страницу, а затем удаляю эту страницу из State. Я уверен, что первый 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
}));
У меня ошибка компиляции на выхлопе ():
Аргумент типа '() => void' нельзя назначить параметру типа '(значение: {тип: строка; полезная нагрузка ?: undefined;} | {тип: строка; полезная нагрузка: любая;}, индекс: число ) ...
Тип 'void' нельзя назначить типу 'ObservableInput <{}>'