У меня есть два промежуточных ПО в моем приложении Reaction-Redux.
- Первый - это API-интерфейс, который отправляет запросы на сервер и анализирует ответ с него.
- Вторым является промежуточное программное обеспечение Auth, которое хранит JWT в локальном хранилище и проверяет, был ли ответ от сервера кодом 401, мы должны обновить наш JWT.
Во втором промежуточном программном обеспечении я пытаюсь вызвать store.dispatch
. В redux devToolsExtension я вижу новое действие, но это действие не переходит к первому промежуточному программному обеспечению ..
код.
Первое промежуточное ПО:
const apiMiddleware = store => next => action => {
const {api, type, ...rest} = action;
if (!api) {
return next(action);
}
next({
type: type + START,
...rest
});
const { url } = api;
let params = getParamsForApiCall(api);
let statusCode;
// TODO timeout from settings
timeout(5000, fetch(url, params).then(response => {
statusCode = processResponse(response);
return response.text();
//
})).then(text => {
let nextType = processAnwer(text, statusCode);
let typeResult = type + nextType;
console.log('Type result action: ', typeResult);
return next({type: typeResult, statusCode, responce: text, ...rest})
//
}).catch(error => {
processError(error)
})
};
Второй:
import {SUCCESS, UNAUTH} from "../../Constants";
import {USER, LOGIN, CHECK_JWT, REFRESH_TOKEN, LOGOUT, userRefreshToken, userLogout } from "../AC/User"
import { HTTP_CODE_UNAUTH } from "../../Constants/http"
import { saveJWTToStore, clearJWTFormStore } from '../../Utils/jwt'
const authMiddleware = ({ dispatch }) => next => action => {
const { type, statusCode, responce, ...rest } = action;
next(action);
switch (type) {
case USER + REFRESH_TOKEN + UNAUTH:
case USER + CHECK_JWT + UNAUTH:
console.log('UNAUTH have to logout');
dispatch(userLogout());
break;
// ---------
case USER + CHECK_JWT + SUCCESS:
case USER + LOGIN + SUCCESS:
let obj = JSON.parse(responce);
let token = obj['token'];
action = Object.assign(action, {token: token});
saveJWTToStore(token);
break;
// ---------
case USER + LOGOUT:
console.log('Remove JWT from localStore');
clearJWTFormStore();
break;
// ---------
default:
let errAuth = statusCode === HTTP_CODE_UNAUTH;
if (errAuth) {
console.log(`Need to refresh JWT`);
// !!! this dispatch does not word as well
dispatch(userRefreshToken());
}
}
};
export default authMiddleware;